/ C, PROGRAMMING

C언어: 문법, 개념 모음

int num = 0xA; 와 같이, 정수에 0x를 붙이면 16진수로 인식.

07과 같이, 정수에 0을 붙이면 8진수로 인식.

switch

switch(num)
{
case1:
(중괄호 없이! 실행 문장 작성)
break;
default:
}

와 같이 구성됨.

case 범위 설정

case 1...10:

과 같이 입력 가능!

static 지역 변수 (static int 등)

static 변수는 단 1번만 초기화되며, 프로그램 종료 시까지 처음 할당된 메모리 공간이 유지된다.

typedef (자료형) (이름)

(이름)(자료형) 대신 사용 가능

scanf 함수를 이용한 문자열의 입력

char str[N];
scanf("%s",str)

그러나 scanf 함수는 문자열 입력에 적합하지 않다.

scanf함수는 공백으로 데이터를 구분짓기 때문이다. 즉 공백이 포함된 문자열을 한번에 입력 받을 수 없다.

#define 으로 정의되는 매크로에 변수 사용 가능

포인터

포인터의 크기: 32비트 프로그램에서 4바이트 정수, 64비트 프로그램에서 8바이트 정수로 고정.

포인터형: 가리키는 주소로부터 몇 바이트를 읽을지, 정수로 읽을지 실수로 읽을지 등을 결정한다. 가리키는 변수의 자료형에 맞추는 것이다.

널 포인터

int* ptr = NULL;
int* ptr = 0;

-> 포인터 변수를 0으로 초기화면 0번지를 가리키지 않고, 아무데도 가리키지 않는 상태가 된다. 초기화시킬 주소가 결정되지 않았을 때 유용.

포인터와 배열의 관계

배열의 이름을 포인터 상수로 볼 수는 없다.

예를 들어, sizeof(arr) 의 연산결과는 배열 arr의 길이이지만, sizeof(&arr[0]) 의 연산결과는 포인터변수와 마찬가지로 메모리 주소의 크기이다.

즉, &arr[0]arr는 그 값은 같을지라도 엄연히 다른 크기를 갖고 있는 다른 수라고 볼 수 있다.

배열을 포인터로 decay(묵시적 형 변환의 일종)하는 것은 가능하지만, 포인터를 배열로 전환하는 것은 불가능하다.

If an array appears on the right-hand side of an assignment, only the pointer it decays to is copied, not the entire array. Furthermore, an array may not appear on the left-hand side of an assignment (in part because, by the previous sentence, there would never be an entire array for it to receive).

배열 이름의 포인터형: 배열의 자료형을 따라간다. 포인터 변수를 배열의 이름처럼 사용할 수도 있다.

배열의 이름에 index를 붙인 형태

예를 들어 arr[0] == *(arr+0)과 같다.

포인터도 이런 방식으로 사용 가능하다.

int*형 포인터 ptr을 예로 들면, *(ptr) == ptr[0]이다.

포인터를 대상으로 하는 증가 및 감소연산

포인터가 가리키는 변수의 자료형 크기만큼 곱해져서 증가한다. (정확히는 포인터 자료형에 의존한다)

따라서, 배열에서도 인덱스 숫자만큼만 더하는 것으로 접근 가능했던 것.

Postfix ++ 연산자

a++ 의 연산 결과는 a이다. (Side effect 는 연산 종료 이후 발생)

연관 게시글

C언어: # Directives