728x90
728x90
포인터의 포인터 (더블포인터)
싱글포인터의 주소값을 저장하는 용도의 포인터
double **ptr2 = &ptr1; //더블포인터
더블포인터의 주소값은 ***로 표현하는데 거의 안쓴다.
double **ptr2 = &ptr1; //더블포인터
double ***ptr3 = &ptr2;
개인적 의문) 포인터의 끝은 어딘거지..?
더블포인터에 의한 Call-By-Reference 예제
포인터가 가리키는 대상을 서로 바꾸는 swap으로
아래는 효과없는 swap 함수의 호출 예제이다.
#include <stdio.h>
int main()
{
int A = 10, B=20;
int* pA, *pB;
pA=&A, pB=&B;
pswap(pA, pB);
// 호출 후
printf("pA가 가리키는 변수 : %d\n", *pA);
printf("pB가 가리키는 변수 : %d\n", *pB);
return 0;
}
// pA, pB 주소값이 p1, p2로 전달된다
// 우리는 p1, p2가 아니라 pA, pB가 가리키는 대상이
// 바뀌어야 하므로 잘못된 예
void pswap(int* p1, int* p2)
{
int* temp;
temp=p1;
p1=p2;
p2=temp;
}
무조건 포인터가 갔다고 call-by-reference이지 않다. 상대적인 것이다.
더블포인터 입장에서의 진정한 swap의 예
#include <stdio.h>
int main()
{
int A = 10, B=20;
int* pA, *pB;
pA=&A, pB=&B;
pswap(&pA, &pB); //주소값을 바꿔준다
// 호출 후
printf("pA가 가리키는 변수 : %d\n", *pA);
printf("pB가 가리키는 변수 : %d\n", *pB);
return 0;
}
void pswap(int** p1, int** p2)
{
int* temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
포인터 배열과 포인터 타입
1차원 배열의 경우 배열이름이 가리키는 대상을 통해 타입이 결정된다.
(2차원 배열은 달라지는데 다음 단원에서 다룰 것)
포인터 배열도 마찬가지이다.
// 포인터 변수 배열의 예
int* arr1[10]; // int형 변수이고 int형 포인터를 가리키니까 int형 더블포인터
double* arr2[20];
char* arr3[30];
포인터는 언제 사용되는가
함수 내에서 데이터 조작
메모리 동적 할당
자료구조 구현
728x90
728x90
'C, C++ > 열혈 C 프로그래밍' 카테고리의 다른 글
열혈 C 19장 함수 포인터와 void 포인터 (0) | 2021.09.13 |
---|---|
열혈 C 18장 다차원 배열 그리고 포인터 (0) | 2021.09.07 |
열혈 C 16장 다차원 배열 (0) | 2021.09.06 |
열혈 C 14장 포인터와 함수에 대한 이해 (0) | 2021.09.03 |
열혈 C 13장 포인터와 배열 함께 이해하기 (0) | 2021.09.02 |