코딩 공부

정보처리기사 실기 C 공부 ① 본문

CS 공부

정보처리기사 실기 C 공부 ①

Algomalgo 2024. 4. 19. 20:49
728x90
  • 변수
    • 예약어(키워드) 사용 불가
    • 공백 포함 불가
    • 첫 글자는 영문 및 언더바(_) 사용 가능(숫자로 시작 불가)
    • 언더바(_) 이외의 특수문자는 사용 불가
    • 대소문자 구분
    • 변수 종류
      • 지역 변수
        • 함수/블록 안에서 선언하는 변수
        • 함수/블록의 종료와 함께 메모리상에서 소멸
        • 초기값이 없으면 쓰레기 값이 들어감
        • 스택 영역에 저장
      • 전역 변수
        • 함수 블록 밖에서 선언하며 전체 함수에 영향을 미친다.
        • 프로그램이 종료될 때 메모리상에서 소멸
        • 초기값이 없으면 0값이 들어감
        • 데이터 영역에 저장됨
      • 정적 변수
        • static으로 선언하며 선언된 블록 내에서만 사용가능
        • 함수가 종료되어도 소멸되지 않고, 값이 그대로 유지됨
        • 프로그램이 종료될 때 메모리상에서 소멸
        • 초기값이 없으면 0이 입력되고, 단 한번만 초기화(이미 사용한 적이 있으면 초기화X)
        • 데이터 영역에 저장
      • 동적 변수
        • malloc(배열, 포인터 쪽)이란 것으로 선언되며, 메모리 동적할당으로 생성되는 변수
        • Run time 시간에 메모리를 할당
        • 동적 기억장소에 할당하여 메모리 낭비를 피하려는 목적
        • 무조건 포인터를 사용해야 함
        • 힙 영역에 저장

  • 연산자
    • 우선순위
      • 괄호[()] > 단항[++,--,~,!] > 산술[*,/,%] > 산술[+,-] > 비트[<<, >>] > 비교[<,<=,>,>=] > 관계[==, !=] > 비트[&,^,|] > 논리[&&,||] > 대입[=, +=, -=, *=, /=, %=]
    • 관계 연산자
      • ==, !=, >, >=, <, <=
    • 논리 연산자
      • !, &&, ||
  • 조건문
#include <stdio.h>
int main()
{
	int i = 3;
    int j = 4;
    if ((++i>j--) && (i++<--j)) i = i-- + ++j; // (++i>j--) 이후 연산은 생략되고 else로 넘어감
    else j = i-- - --j
    printf("%d\n", i); // i = 3, j = 2
}
  • 출력 변환기호
    • %d : 10진수 [정수,문자] --> ASCII 'A'=65
      • %5d, 13 --> ___13
      • %05d, 13 --> 00013
    • %f : 고정 소수점 [정수, 실수] 기본 소수 6자리
      • %f, 3.26 --> 3.260000
      • %6.1f, 3.3 --> ___3.3
      • %-6.1f, 3.26 --> 3.3___
      • %-6.3f, 3.26 --> 3.260__
    • %c : 문자 출력 [문자 1개]
    • %s : 문자열 출력 [문자열 포인터]
    • %x : 16진수 출력 [정수]
    • %o : 8진수 출력 [정수] 
  • 비트연산자
    • &(AND) : 5&3 = 1
    • |(OR) : 5|3 = 7
    • ^(XOR) : 5^3 = 6 [둘이 다를 때 참]
    • ~(NOT) : ~5 = -6, ~-5 = +4
    • >>(비트를 우측으로 이동) : 5>>3
      • 10 >> 2 : 10 = 2
      • 10 << 2 : 101000 = 40
    • <<(비트를 좌측으로 이동) : 5<<3
  • 매크로 : 반복적인 일들을 쉽게 하기 위해 만들어 놓은 것
    • #define N 10
    • #define SQR(X) X*X
      • SQR(N) = 100
      • SQR(N+2) = 32
  • 삼항 연산자
    • 조건 ? 참 : 거짓
    • int a = 10 > 5 ? 10 : 5  -----> a = 10

  • 포인터
int b = 10;
int *a;
a = &b;
printf("%d\n", *a);    // 10
printf("%d\n", a);    // b의 주소값
printf("%d\n", b);    // 10
int i = 10;
int j = 20;
int *k = &i;

scanf("%d", k); // 90을 입력했다고 치자.
printf("%d, %d, %d\n", i, j, *k); // 90, 20, 90
int i;
int a[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
int *ptr = a+3;
for (i=0; i<5; i++){
    printf("%d", *(ptr+i)-3);
}

// 37, 47, 57, 67, 77
int a[5];
int *b = a;
a[2] = 10;
b[2] = 20;

printf("%d", a[2]) // 20
  • 2차원 배열과 포인터
int a[3][2] = {{1, 2}, {3, 4}, {5, 6}};
// a[0] 주소지를 100이라고 치자
printf("%d]n", a);    // 100
printf("%d\n", *a);    // 100
printf("%d\n", **a);    // 1
int darr[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int sum1, sum2;
sum1 = *(*darr+1) + *(*darr+2); // 2 + 3
sum2 = *darr[1] + *darr[2];  // 4 + 7
printf("%d, %d", sum1, sum2); // 5 , 11
  • 포인터 배열
#include <stdio.h>
int main(){
    char *array1[2] = {"Good morning", "C language"}
    printf("%s\n", array1[0]+5);  // morning
    printf("%c\n", *(array1[1]+6));  // u
}
int *arr[3];
int a = 12, b = 24, c = 36;
arr[0] = &a;
arr[1] = &b;
arr[2] = &c;
printf("%d\n", *arr[1] + **arr + 1) // 24 + 12 + 1 = 37
  • 구조체
struct person
{
    char *name;
    int age;
} test;
test.name = "h user";
test.age = 40;
printf("%s : %d", test.name, test.age);
struct person
{
    char *name;
    int age;
};
struct person *p;
p -> name = "test_2";
p -> age = 40;
printf("%s : %d", p->name, p->age);
struct list{
	int *fp;
} data, *p;
int x[] = {100, 200, 300, 400};
p = &data
p->fp = x + 1;
printf("%d", *(++p->fp)); // 300
  • 배열 포인터 : 배열의 시작 주소값을 저장할 수 있는 포인터 2차원 배열의 구조(그냥 하나의 포인터일 뿐)
int (*in)[4]; // 4개씩 자르겠다.
int num[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
in = num;

printf("%d", **in); // 1
printf("%d", *(*in+1)); // 2
printf("%d", **(in+1); // 5
#include <stdio.h>
#include <stdlib.h>
#define N 3
int main(void){
	int (*in)[N], *out, sum=0;
    in = (int (*)[N]) malloc(N*N*sizeof(int));
    out = (int *) in;
    for (int i = 0; i<N; i++) out[i] = i;
    for (int i=0; i<N; i++) sum += in[i][i];
    printf("%d", sum);  // 12
    return 0;
}
728x90