반응형
포인터의 포인터(이중 포인터)
int ** dptr; // int형 이중 포인터
포인터 변수는 종류에 상관없이 무조건 주소 값을 저장하는 변수
이중 포인터 변수는 포인터 변수를 가리키는 대상에서 차이가 있습니다.
double num = 3.14;
double *ptr = #
double **dptr = &ptr;
double *ptr2 = *dptr;
ptr과 ptr2와 동일한 대상을 가리키게 되었습니다.
잘못된 swap 예제
#include <stdio.h>
void swap(int* x, int* y) {
int* temp = x;
x = y;
y = temp;
}
int main(void) {
int a = 10, b = 20;
int* p1, *p2;
p1 = &a, p2 = &b;
printf("%d %d \n", *p1, *p2);
swap(p1, p2);
printf("%d %d \n", *p1, *p2);
}
변수 a, b 값이 교환되지 않았습니다.
이는 x와 p1, y와 p2는 별개이기 때문입니다.
① p1의 값이 x에 대입되어 x는 a를 가르키게 됩니다.
p2의 값이 y에 대입되어 y는 b를 가르키게 됩니다.
② swap으로 인해 x와 y가 가리키고 있는 값이 바뀝니다.
이때 p1과 p2가 가리키고 있는 것에는 변화가 없으며, a, b 실제값에도 변화는 없습니다.
이중 포인터를 이용한 swap()
#include <stdio.h>
void swap(int **dp1, int **dp2) {
int* temp = *dp1;
*dp1 = *dp2;
*dp2 = temp;
}
int main(void) {
int a = 10, b = 20;
int*p1, *p2;
p1 = &a, p2 = &b;
printf("%d %d \n", *p1, *p2);
swap(&p1, &p2);
printf("%d %d \n", *p1, *p2);
}
swap이 정상적으로 성공
① p1의 주소를 dp1에 전달, p2의 주소를 dp2에 전달
② dp1, dp2가 가리키고 있는 값에 저장된 값을 swap 합니다.
즉, dp1의 실제값(p1), dp2의 실제값(p2)가 교환되어 p1,p2가 가리키고 있는 값이 달라집니다.
배열도 마찬가지로 적용할 수 있습니다.
배열의 이름이 하나의 포인터이므로 아래와 같이 사용 합니다.
#include <stdio.h>
void swap(int **dp1, int **dp2) {
int* temp = *dp1;
*dp1 = *dp2;
*dp2 = temp;
}
int main(void) {
int num1 = 10, num2 = 20, num3 = 30;
int* p1 = &num1, * p2 = &num2, * p3 = &num3;
int* ptrArr[] = { p1, p2, p3 };
int** dptr = ptrArr;
printf("%d %d %d \n", *(ptrArr[0]), *(ptrArr[1]), *(ptrArr[2]));
printf("%d %d %d \n", *(dptr[0]), *(dptr[1]), *(dptr[2]));
}
포인터 변수의 활용은 자료구조나 알고리즘에서 주로 이용되며
현재로는 함수 내에서 함수 외부에 선언된 변수에 접근하는 방법으로 이해.
자주 사용되는 swap 예시
#include <stdio.h>
void swap(int * x, int * y) {
// 주소에 저장된 실제값들을 교환
int temp = *x;
*x = *y;
*y = temp;
}
int main(void) {
int a = 10, b = 20;
printf("%d %d \n", a, b);
// 참조하는 주소값을 전달
swap(&a, &b);
printf("%d %d \n", a, b);
}
반응형
'프로그래밍 언어 > C 언어' 카테고리의 다른 글
[C] 로그(log) 함수 (0) | 2021.09.01 |
---|---|
[C] 함수 포인터와 void 포인터 (0) | 2021.03.20 |
[C] 포인터 변수 개념 (0) | 2021.03.20 |
[C] 다차원 배열과 포인터 관계 (0) | 2021.03.20 |
[C] Call-by-value & Call-by-reference (0) | 2021.03.20 |
댓글