포인터와 메모리
int * ptr
- 포인터는 메모리 공간을 만들어 변수의 주소를 저장하는 역할을 한다.
- * 연산자를 사용하며, 저장할 변수의 자료형에 따라 포인터의 자료형도 바뀐다.
- int * ptr 는 pointer to int 라고 부르며, 말 그대로 int 자료형 정수의 메모리 주소를 가리키는 포인터라는 뜻을 가지고 있다.
- 포인터의 크기는 32비트 컴퓨터에서 4바이트, 64비트 컴퓨터에서 8바이트다.
- 포인터는 메모리 공간을 가리키는 역할이기 때문에, 그 자체로 변수를 대입해 초기화하거나 사칙연산 등의 연산을 할 수 없다.
- 즉, 포인터를 하나의 자료형으로 본다면, int *ptr에 대입할 수 있는 변수는 '주소'를 가리키는 변수인 것이다. 이를 나타내는 방법으로 '&' 연산자를 사용한다. 이는 address to int 라고 부르며, pointer to int 와 본질적으로 같다.
int num = 10;
int *ptr = #
printf("address of num: %p\n", &num);
printf("value of ptr: %p\n", ptr);
// 위 두 printf 값은 동일한 메모리 주소가 나온다.
- 포인터의 주소가 아닌 '저장된 값'을 가져오고 싶다면, 역참조 연산자인 '*'를 사용하면 된다.
- *ptr = num; 과 같이 쓸 수 있으며, ptr이 가리키는 메모리 안에 저장돼 있는 값을 가져오는 것이다.
void *ptr
- void 포인터는 자료형이 정해지지 않은 포인터다.
- int, double, float, long long 등 모든 자료형과 호환가능하다.
- 하지만 자료형이 정해지지 않은 포인터이니만큼 메모리의 크기를 알 수 없어 역참조를 할 수 없다.
이중 포인터
- *연산자를 n번 쓰면 n중 포인터가 되고, 차례대로 pointer->pointer->pointer->...->num 을 가리키게 된다.
- 이중 포인터의 값에 접근하기 위해 역참조 연산자를 쓸 때도 두 개를 써야 한다.
malloc
- 메모리를 동적으로 할당할 때 사용하는 메모리 생성 함수로, <stdlib.h> 헤더 파일에 포함돼있다.
- malloc 함수의 매개변수로는 할당할 메모리의 크기가 들어가고, 메모리를 사용하고 난 뒤, 꼭 free 함수를 사용해 메모리를 해제해줘야 한다.
- malloc 함수를 통해 할당된 메모리는 'heap' 영역에 저장된다 (변수는 'stack').
int * ptr1 = malloc(sizeof(int));
char * ptr2 = malloc(sizeof(char)*4+1);
int num = 10;
ptr1 = #
ptr2 = "dope";
free(ptr1);
free(ptr2);
memset
- 메모리를 특정 값으로 채울 때 사용하는 함수로, <string.h> 헤더 파일에 포함돼있다.
- memset(ptr, 0, sizeof(int)) 등과 같이 사용한다.
NULL potiner
- 아무 것도 가리키지 않는 포인터를 널 포인터라고 하며,
int * ptr = NULL; 과 같이 선언/초기화 한다.