17. 포인터의 포인터

I. 포인터의 포인터에 대한 이해

  • 더블 포인터가 가리키는 것은 싱글포인터
  1. int main()
    {
    double val = 3.14;
    double *ptr1 = &val;
    double **ptr2 = &ptr1;
  2. printf("val : %lf\n",val);
  3. printf("&val : %lf\n",&val);
    printf("ptr1 : %lf\n",ptr1);
    printf("&ptr1 : %lf\n",&ptr1);
    printf("*ptr1 : %lf\n",*ptr1);
    printf("ptr2 : %lf\n",ptr2);
    printf("&ptr2 : %lf\n",&ptr2);
    printf("*ptr2 : %lf\n",*ptr2);
    printf("**ptr2 : %lf\n",**ptr2);
    }
  •  위의 소스를 컴파일 하기 전에 먼저 예상을 해보는 것도 좋다.

    • **ptr2 = *(*ptr2) = *(ptr1) = val 이런식으로 나타 낼수 있다.
    • 그림은 각자 생각해 보자
  • 더블 포인터에 의한 Call-By-Reference

    •  Call-By-Reference가 기억이 안나면 14장으로 돌아가서 한번 다시 보고 오는 것이 좋다.
    •  아래의 소스를 보자
  1.  #include <stdio.h>
  2. void pswap(int *p1,int *p2);
  3. int main(void)
    {
     int A =10,B = 20;
     int *pA, *pB;
  4.  pA= &A,pB = &B;
  5.  printf("pA가 가리키는 변수 : %d\n",*pA);
     printf("pB가 가리키는 변수 : %d\n",*pB);
  6.  pswap(pA,pB);
     
     printf("pA가 가리키는 변수 : %d\n",*pA);
     printf("pB가 가리키는 변수 : %d\n",*pB);
  7.  return 0;
    }
  8. void pswap(int *p1,int *p2)
    {
     int *temp;
     temp = p1;
     p1 = p2;
     p2 = temp;
    }
  •  위의 소스는 결과가 Call-By-Reference가 아닌 Call-By-Value의 결과가 되어 버렸다.

    • 이유는 pA값을 넘겨주면서 값이 복사가 되어서 넘어가기 때문에 교환되는 것은 전혀 다른 것이다.
    • 아래의 소스처럼 바꿔보자
  1.  #include <stdio.h>
  2. void pswap(int *p1,int *p2);
  3. int main(void)
    {
     int A =10,B = 20;
     int *pA, *pB;
  4.  pA= &A,pB = &B;
  5.  printf("pA가 가리키는 변수 : %d\n",*pA);
     printf("pB가 가리키는 변수 : %d\n",*pB);
     pswap(&pA,&pB);
      
     printf("pA가 가리키는 변수 : %d\n",*pA);
     printf("pB가 가리키는 변수 : %d\n",*pB);
     
     return 0;
    }
  6. void pswap(int **p1,int **p2)
    {
     int *temp;
     temp = *p1;
     *p1 = *p2;
     *p2 = temp;
    }
  • 위의 소스를 보면 앞전에 봤던 소스에서 인자를 넘길때 포인터의 주소값을 넘겨준다.

    • 포인터 값을 넘겨주는 것이 아니라 주소를 넘겨주기 때문에 pswap에서는 더블포인터로 선언한 것이고, 값의 복사가 아닌 주소값이 바뀌게 된다.

문제

17 -1

문제1

두개의 int형의 포인터와 길이 5인 int형 배열을 선언한 다음, 총 5개의 정수를 사용자로부터 입력받는다. 그리고 나서 두개의 포인터와 배열을 함수 MaxMin의 인자로 전달한다. 함수 호출이 완료되고 나면 max와 min은 배열의 최대값과 최소값을 가리키고 있어야 한다. 이러한 기능을 지니는 함수 MaxMin을 정의하고, 이에 적절한 main 함수도 구현해 보자. main함수의 마지막에서는 포인터 max와 min이 가리키는 메모리를 지니고 있는 값을 출력하기로 하자. 

이 글은 스프링노트에서 작성되었습니다.

Posted by kid1412
,