더블 포인터
double num = 3.14;
double *ptr = #
double **dptr = &ptr;
// dptr -> ptr, ptr -> &num
*(*dptr)) == **dptr == num
void Swap(int *p1,int *p2)
{
int *temp = p1;
p1 = p2;
p2 = temp;
}
int main(void)
{
int num1 = 10, num2 = 20;
int *ptr1, *ptr2;
ptr1 = &num1, ptr2 = &num2;
//*ptr1 = 10, *ptr2 = 20
Swap(ptr1,ptr2);
//*ptr1 = 10, *ptr2 = 20
}
위 코드에서 Swap함수에도 불구하고 ptr1과 ptr2이 가르키는 것이 서로 바뀌지 않았다.
이유는 매개변수인 p1과 p2가 가르키는 것만 바뀌었을 뿐, ptr1과 ptr2가 가르키는 것은 바뀌지 않았기 때문이다.
void Swap(int **d1,int **d2)
{
int *temp = *d1;
*d1 = *d2;
*d2 = temp;
}
int main(void)
{
int num1 = 10, num2 = 20;
int *ptr1, *ptr2;
ptr1 = &num1, ptr2 = &num2;
//*ptr1 = 10, *ptr2 = 20
Swap(&ptr1,&ptr2);
//*ptr1 = 20, *ptr2 = 10
}
&ptr1와 &ptr2을 d1,d2가 받으면, *d1,*d2는 각각 ptr1과 ptr2를 뜻하게 된다.
int *temp는 주소를 받아야 하므로 포인터 변수로 선언했다.
int num1 = 10, num2 = 20, num3 = 30;
int *ptr1 = &num1;
int *ptr2 = &num2;
int *ptr3 = &num3;
int *ptrArr[] = {ptr1,ptr2,ptr3};
int **dptr=ptrArr; //ptr1의 주솟값
//*(ptrArr[0]) == *(dptr[0])
**dptr = ptrArr 에서 ptrArr는 num1의 주소 값을 담고 있는 ptr1의 주소 값이므로 더블포인터이다.
int arr[3][2];
int arr2[2][3];
//arr : 0
//arr+1 : 8 (4x2)
//arr2 : 0
//arr2 + 1 : 12 (4x3)
//배열의 가로 길이 만큼 커진다.
배열에서 이름 자체는 맨 처음의 주소 값을 의미하는데, 2차원 배열에서 1을 더하면 다음 행의 첫번째의 주소를 가르킨다.
int (*ptr) [4];
// 4(가로길이)씩 증가 및 감소하는 포인터 변수
위와 같은 형식으로 포인터 변수를 선언한다.
int arr[2][2]={{1,2},{3,4}}
int (*ptr)[2];
ptr = arr;
// ptr[0][0], ptr[0][1], ptr[1][0], ptr[1][1] 과 같이 똑같이 접근가능
1차원 배열을 가르키는 포인터는 1차원 배열의 이름과 같이 쓸 수 있고,
이와 같이 2차원 배열을 가르키는 포인터도 2차원 배열의 이름과 같은 방식으로 쓸 수 있다.
int *arr[4]; // 포인터의 배열
int (*arr2)[4] //배열의 포인터
** 위 두개 혼동 금지!
void func(int (*parr)[7]){
}
void func2(int parr[][7]){
}
// 위 두개는 매개변수에서만 똑같은 의미를 지닌다.
int main()
{
int arr[2][7]={}
func(arr)
}
arr[2][1] = 4;
*(arr+2)[1] = 4;
*(arr[2]+1) = 4;
*(*(arr+2)+1) = 4;
//모두 같다.
'궁금한 지식' 카테고리의 다른 글
MVC, MVP, MVVM 패턴 - (Vue.js를 공부하며) (0) | 2021.01.12 |
---|---|
Vue.js를 공부하며 필요한 자바스크립트 지식들 (0) | 2021.01.11 |
포인터 (Pointer) - 1 (0) | 2021.01.08 |
해쉬 테이블(Hash Table) (0) | 2021.01.03 |
API vs 라이브러리 (0) | 2021.01.02 |