포인터의 포인터
이중 포인터란?
정의
•
포인터(포인터 변수) : 메모리를 할당받는 변수(주소값 저장)
•
이중 포인터 : 다른 포인터 변수의 주소를 갖는 포인터
◦
즉, 대상 자료형을 간접 참조하면 또 다른 포인터가 존재하고, 그 포인터를 다시 간접 참조하면 최종 대상 자료형의 데이터에 접근 가능
예시(코드)
#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
복사
참고 자료



