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;
    }
    
    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)