C언어 더블포인터 함수 관련 질문
조회수 702회
코드의 내용은 아래와 같습니다. 아래에 있다시피 매개변수의 형태가 더블포인터로 되어있을때 인자를 넘겨줄때 왜 인자포인터에 &를 붙여야하는지 모르겠습니다.
예를 들면 ptr가 싱글포인터로 지정되어있을때, printf("%p %p",ptr,&ptr); 을 실행한다면 똑같은 주소값을 표시하는걸 알 수 있습니다.
이렇게 포인터 자체 그것 만으로 주소값을 의미하고 가르키는건데 &를 붙이는 이유가 단지 문법에 어긋나기 때문인가요?
--------------------코드 내용 ----------------------------------
include
void maxandmin(int **max,int **min,int *arr)
{
char i;
int *maxp,*minp;
maxp = arr;
minp = arr;
for(i=1;i<5;i++)
{
maxp = *maxp > arr[i] ? maxp : &arr[i];
minp = *minp < arr[i] ? minp : &arr[i];
}
*max = maxp;
*min = minp;
return;
}
int main() {
int *maxptr;
int *minptr;
int arr[5] = { 3 , 4 , 5, 1, 2 };
maxandmin(&maxptr,&minptr,arr); // 왜 maxptr은 되지않고 &을 붙여야만 해?
printf("MAX = %d , MIN = %d ",*maxptr,*minptr);
return 0;
}
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
포인터와 더블포인터는 주소값이 저장된다는 점은 같지만 엄연히 다른 데이터타입입니다.
이 case는 포인터 변수에 대한 call-by-reference를 구현하기 위해 더블포인터 변수가 쓰인 경우입니다.
역참조자(* 연산자) 결과의 차이를 이해하시면 왜 다른지 아시게 될겁니다.
int a = 100; int* p = &a; int** d = &p;
*p는 a의 value를 역참조합니다. *d는 p의 value(a의 주소)를 역참조합니다.
즉 더블포인터변수 d 에는 a의 주소를 담고 있는 p 의 주소가 저장되어 있는 것입니다.
더블포인터가 헷갈리는 것은 포인터가 이중구조라서 그런 것인데, 치환을 이용해서 생각해보면 간단합니다.
typedef int* PINT; // PINT* == int**
int** 에서 int*를 PINT로 치환하면 PINT의 포인터 타입으로 볼 수 있습니다. 그러면 함수 원형에서 아래와 같이 코드를 바꿀 수 있습니다.
void maxandmin(PINT* max, PINT* min, PINT arr) { char i; PINT maxp, minp; maxp = arr; minp = arr; for(i=1;i<5;i++) { maxp = *maxp > arr[i] ? maxp : &arr[i]; minp = *minp < arr[i] ? minp : &arr[i]; } *max = maxp; *min = minp; return; } int main() { PINT maxptr; PINT minptr; int arr[5] = { 3 , 4 , 5, 1, 2 }; maxandmin(&maxptr, &minptr,arr); // PINT의 포인터 타입이기 때문에 &을 붙여야 함 printf("MAX = %d , MIN = %d ",*maxptr,*minptr); return 0; }
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력