포인터 (Pointer) - sihyun10/data_structures_docker GitHub Wiki
포인터는 메모리의 주소값이고, 이 값을 저장해 줄 수 있는 변수를 포인터 변수라고 부른다

포인터 변수 p
가 변수 i
의 주소를 저장한다는 것을 나타낸 것이다
포인터 이름 앞에 *를 붙여준다
(형에 붙여도 된다)
int *p;
int* p;
C에선 포인터에서만 쓰이는 연산자 2가지를 제공한다
어떤 변수의 주소[자리]를 가져올때 사용하는 &
주소 연산자와 포인터가 가르키는 개체에 접근할 땐 *
참조 연산자를 사용한다
- 주소 연산자 (
&
)
int x = 10;
printf("%p\n", &x); //x의 주소 출력 (16진수 형태로)
x가 저장된 메모리 위치(주소)를 출력할 수 있다
🔎 Tip) %p
는 포인터(주소)를 출력할 때 쓰는 포맷 문자열
- 참조 연산자 (
*
)
포인터 변수가 개체를 가리키고 있다면 참조 연산자 *
를 통해 개체가 어떤 값을 갖는지 접근 가능하다
즉, 메모리 주소에 접근해 값을 가져오고 저장한다
int x = 10;
int *p = &x;
printf("%d\n", *p); //10
int x = 10;
int *p = &x; //포인터 할당
printf("%d\n", *p); //10
*p = 20;
printf("%d\n", x); //20
- p : int형 값을 저장하는 변수의 주소를 저장할 수 있다
- 즉 x의 주소값이 p에 복사(=할당)된다
- 포인터를 통해 값을 읽고, 쓸 수 있다
<참고>
포인터가 어떤 변수의 주소를 저장한 경우 => '가르킨다'라고 함
즉 'p는 x를 가르킨다'라고 일컬을 수 있다.
포인터 p가 x를 가르키므로 *p에 20을 대입하면 결국 x에 20을 대입하는 것과 같다.
int arr[3] = {10, 20, 30};
int *p = arr;
- 배열(arr)이름은 첫번째 요소의 주소를 의미
- arr == &arr[0]; 과 같다. 즉 p = &arr[0];
printf("%d\n", arr[1]); // 20
printf("%d\n", *(p + 1)); // 20
포인터에 정수(j)를 더하면 p가 현재 가리키는 원소에서부터 j만큼 떨어진 원소를 가리키게 된다
malloc 함수로 원하는 시점에 원하는 만큼 메모리를 할당할 수 있는 동적 메모리 할당을 해서 메모리 공간의 크기를 넣어준다
#include <stdlib.h>
int *p = (int *)malloc(sizeof(int)); // 정수 하나의 공간 할당
malloc 함수는 힙에서 메모리를 할당하므로 반드시 해제를 따로 해주어야 메모리 누수가 발생하지 않는다.
free(p);
malloc으로 얻은 메모리는 꼭 free()
로 해제해주어야한다
해제하지 않으면 메모리 누수가 발생하게 된다
malloc 함수로 동적으로 메모리를 할당하면 유연한 크기 조절 가능해진다
메모리를 다 쓰면 반드시 free()로 해제해주어야한다
포인터 변수를 가리키는 또 다른 포인터 변수를 뜻함
int a = 3;
int* b = &a;
int** c = &b;
<포인터 이해 짤>