////
Search

이중 포인터

포인터의 포인터

이중 포인터란?

 포인터를 가리키는 포인터

정의

포인터(포인터 변수) : 메모리를 할당받는 변수(주소값 저장)
이중 포인터 : 다른 포인터 변수의 주소를 갖는 포인터
즉, 대상 자료형을 간접 참조하면 또 다른 포인터가 존재하고, 그 포인터를 다시 간접 참조하면 최종 대상 자료형의 데이터에 접근 가능

예시(코드)

#include <stdio.h> int main() { int a = 3; double ad = 3.0; int *b = &a; double *bd = &ad; printf("b가 가리키는 값 = %d\n", *b); // *를 앞에 붙여서 값 가져오기 printf("b의 값 = %p\n", b); printf("bd가 가리키는 값 = %.1f\n", *bd); // *를 앞에 붙여서 값 가져오기 printf("bd의 값 = %p\n", bd); }
C
복사
포인터
포인터 실행결과 출처 : https://jimmy-ai.tistory.com/54
#include <stdio.h> int main() { int a = 3; int* b = &a; int** c = &b; // 포인터 변수를 가리키는 변수 printf("a에 저장된 값 = %d\n", a); printf("b에 저장된 값 = %p\n", b); printf("c에 저장된 값 = %p\n", c); // 똑같이 %p로 포맷팅 printf("b가 가리키는 값 = %d\n", *b); printf("c가 가리키는 값 = %p\n", *c); // 여전히 포인터라 %p printf("c가 최종적으로 가리키는 값 = %d\n", **c); //**로 두번 접근 }
C
복사
이중포인터
이중포인터 실행결과 출처 : https://jimmy-ai.tistory.com/54

이중포인터 사용 이유

1) 함수에서 포인터를 변경하고 싶을 때

C에서 함수로 포인터를 넘기면 복사본이 넘어감 → 원래 포인터가 가리키는 대상 자체를 변경하고 싶다면 이중 포인터 필요

 포인터만 넘긴 경우

void reset(int *p) { int temp = 5; p = &temp; // 복사본만 변경됨 } int main() { int a = 10; int* p = &a; reset(p); printf("%d\n", *p); // 여전히 10(안 바뀜) }
C
복사

 이중 포인터를 넘긴 경우

void reset(int **pp) { int temp = 5; *pp = &temp; // 원래의 포인터가 가리키는 대상 변경 } int main() { int a = 10; int *p = &a; reset(&p); printf("%d\n", *p) // 5(바뀜) }
C
복사

2) 2차원 배열처럼 동적 메모리 할당할 때

정적인 2차원 배열은 컴파일 시 크기가 고정되어야 하므로, 런타임에 크기를 결정해야할 때는 사용할 수 없습니다.
int **matrix; matrix = malloc(sizeof(int *) * 3); // 행 포인터 3개 for (int i=0; i<3; i++) { // 각 행에 열 4개 할당 matrix[i] = malloc(sizeof(int) * 4); }
C
복사
matrix : 포인터들의 배열(행)
matrix[i] : 각 행을 가리키는 int*
matrix[i][j] : 그 행의 j번째 열

3) 문자열을 함수에서 수정해서 넘겨줄 때

void setString(char **str) { // 2) 이제 s가 "Hello, World!"를 가리키게 됨 // 즉, "Hello, World!"의 시작 주소를 가리키게 됨 *str = "Hello, World!"; } int main() { char *s; // 0) 포인터 선언 : 아직 아무것도 가리키지 않은 상태 setString(&s); // 1) 포인터 s의 주소를 넘김 printf("%s\n", s); // 결과 : Hello, World! return 0; }
C
복사
참고 자료