포인터 (Pointer) - sihyun10/data_structures_docker GitHub Wiki

포인터 정의

포인터는 메모리의 주소값이고, 이 값을 저장해 줄 수 있는 변수를 포인터 변수라고 부른다

image

포인터 변수 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 (memory allocation)

malloc 함수로 원하는 시점에 원하는 만큼 메모리를 할당할 수 있는 동적 메모리 할당을 해서 메모리 공간의 크기를 넣어준다

#include <stdlib.h>

int *p = (int *)malloc(sizeof(int));  // 정수 하나의 공간 할당

malloc 함수는 힙에서 메모리를 할당하므로 반드시 해제를 따로 해주어야 메모리 누수가 발생하지 않는다.

- free

free(p);

malloc으로 얻은 메모리는 꼭 free()로 해제해주어야한다
해제하지 않으면 메모리 누수가 발생하게 된다

정리

malloc 함수로 동적으로 메모리를 할당하면 유연한 크기 조절 가능해진다
메모리를 다 쓰면 반드시 free()로 해제해주어야한다


이중 포인터 (포인터의 포인터)

포인터 변수를 가리키는 또 다른 포인터 변수를 뜻함

int a = 3;
int* b = &a;
int** c = &b;

Double pointer


<포인터 이해 짤>

pointer_gif

⚠️ **GitHub.com Fallback** ⚠️