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 는 연산 종료 이후 발생)