본문 바로가기

DEVELOPMENT/C/C++

[C/C++] 포인터 예제 소스 및 설명

 

예제 1. 포인터의 개념

 

  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.     int i = 10, j = 20, *a;     // 정수 변수 i, j, 및 정수 포인터 변수 a선언
  6.     a = &i;                     // 정수 포인터 변수 a에 i의 주소 저장
  7.     printf("%p, %p\n", &i, &a); // 정수 변수 i의 주소 및 a의 주소 출력
  8.     printf("%d\n\n", *a);       // 정수 포인터 a가 가리키는 곳의 데이터 출력,

                                    // 즉, 정수 포인터 a는 i의 주소를 가지고 i의 값을 출력한다.

  9.     a = &j;                     // 정수 포인터 변수 a에 j의 주소 저장
  10.     printf("%p, %p\n", &j, &a); // 정수 변수 i의 주소 및 a의 주소 출력
  11.     printf("%d\n", *a);         // 정수 포인터 a가 가리키는 곳의 데이터를 출력,

                                    // 즉, 정수 포인터 a는 j의 주소를 가지고 j의 값을 출력한다.

  12.  
  13.     // 포인터 변수 a의 주소는 변하지 않는다. a가 가지는 포인터 값만 변하기 된다.
  14. }

예제1 실행결과 :

 

 

 

 

예제2. 정수배열 포인터를 이용하여 덧셈하기

 

  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.     int x[10] = {45, 77, 89, 38, 29,
  6.         58, 93, 84, 73, 66};            // 정수 배열 x선언 및 초기화
  7.     int sum = 0, i, *x1;                // 정수 변수 선언 및 정수 포인터 변수 선언                                 
  8.  
  9.     x1 = &x[0];                         // 정수 포인터 변수 x1에 x[0]의 주소 대입. 또는 x1 = x라고 해도 된다.
  10.                                         // 여기서 x는 포인터 상수라 하며, x는 포인터 상수라 하며,

                                            // x1은 포인터 변수라 한다. x는 포인터이긴 하지만 이 포인터 값은 변하지 않는다.

  11.                                         // 그러나 x1은 포인터 변수로 선언되었으므로 포인터 값이 변할 수 있다.
  12.  
  13.     for(i = 0; i<10; i++){              // 배열에 저장된 10개의 데이터를 순서대로 sum에 합한다.
  14.                                         // 이때 x1의 값을 증가시킨다.

                                            // x1은 정수 포인터이며 정수포인터는 정수데이터의 저장크기 만큼인

  15.                                         // 4씩 자동으로 증가한다.

  16.                                         // 우리가 사용하는 PC는 바이트 단위 주소 지정방식을 사용하며,
  17.                                         // 따라서 하나의 정수는 4개의 주소에 나누어 저장된다.
  18.  
  19.         sum += *x1;                     // 포인터 변수 x1을 증가시키면서 그 포인터가 가리키는 곳의 값(*x1)을 sum에 누적한다.
  20.     }
  21.     printf("sum = %d\n", sum);
  22.  
  23.     // 배열의 주소를 순서대로 출력해 보라. 그러면 4씩 증가하는것을 볼 수 있을것이다.
  24. }

예제2 실행결과 :

 

 

 

예제3. 포인터를 이용하여 2차원 배열 덧셈하기.

 

  1. #include <stdio.h>
  2.  
  3. // 행(ROW)과 열(COL)을 3,3으로 지정
  4. #define ROW 3
  5. #define COL 3
  6.  
  7. int main()
  8. {
  9.     // 정수 배열 x, y 선언 및 초기화
  10.     int x[ROW][COL] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  11.     int y[ROW][COL] =  {9, 8, 7, 6, 5, 4, 3, 2, 1};
  12.  
  13.     // 결과가 저장될 배열 z선언
  14.     int z[ROW][COL];
  15.    
  16.     int i, j, *x1, *y1, *z1;
  17.  
  18.     // 배열 x, y, z의 시작 주소를 포인터 변수 x1, y1, z1에 대입한다.
  19.     x1 = &x[0][0];
  20.     y1 = (int *)y;
  21.     z1 = (int *)z;
  22.  
  23.     // 1차원적으로 x(x1), y(y1), 배열의 각 요소를 더해서 배열 z(z1)에
  24.     // 저장한다. 각 포인터를 증가시키며 계산한다. 정수포인터는 4씩
  25.     // 자동으로 증가한다. 프로그래머가 신경쓸 필요가 없다.
  26.     for(i = 0; i < ROW*COL; i++, x1++, y1++, z1++)
  27.         *z1 = *x1 + *y1;
  28.  
  29.     //포인터가 변했으므로 다시 z1의 포인터를 z의 시작주소로 바꾼다.
  30.     z1 = (int *)z;
  31.  
  32.     //z1의 포인터를 증가하면서 계산 결과를 출력한다.
  33.     for(i = 0; i < ROW; i++)
  34.     {
  35.         for(j = 0; j < COL; j++)
  36.             printf("%3d ", *z1++);
  37.         printf("\n");
  38.     }
  39. }

예제3 실행결과 :

 

 

 

출처 : http://ic.bu.ac.kr/mediawiki/index.php/%EC%A0%95%EC%88%98%ED%8F%AC%EC%9D%B8%ED%84%B0