SPRING :: NOTE

[C] 포인터 예제 소스 및 설명 본문

Development Language/C · C++ · MFC

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

RAYZIE 2016. 6. 9. 17:56
반응형

예제 1. 포인터의 개념


#include 
 
int main()
{
    int i = 10, j = 20, *a;     // 정수 변수 i, j, 및 정수 포인터 변수 a선언
    a = &i;                     // 정수 포인터 변수 a에 i의 주소 저장
    printf("%p, %p\n", &i, &a); // 정수 변수 i의 주소 및 a의 주소 출력
    printf("%d\n\n", *a);       // 정수 포인터 a가 가리키는 곳의 데이터 출력,
                                // 즉, 정수 포인터 a는 i의 주소를 가지고 i의 값을 출력한다.
    a = &j;                     // 정수 포인터 변수 a에 j의 주소 저장
    printf("%p, %p\n", &j, &a); // 정수 변수 i의 주소 및 a의 주소 출력
    printf("%d\n", *a);         // 정수 포인터 a가 가리키는 곳의 데이터를 출력,
                                // 즉, 정수 포인터 a는 j의 주소를 가지고 j의 값을 출력한다.
 
    // 포인터 변수 a의 주소는 변하지 않는다. a가 가지는 포인터 값만 변하기 된다.
}


예제1 실행결과 :




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


#include 
 
int main()
{
    int x[10] = {45, 77, 89, 38, 29,
        58, 93, 84, 73, 66};            // 정수 배열 x선언 및 초기화
    int sum = 0, i, *x1;                // 정수 변수 선언 및 정수 포인터 변수 선언                                 
 
    x1 = &x[0];                         // 정수 포인터 변수 x1에 x[0]의 주소 대입. 또는 x1 = x라고 해도 된다.
                                        // 여기서 x는 포인터 상수라 하며, x는 포인터 상수라 하며,
                                        // x1은 포인터 변수라 한다. x는 포인터이긴 하지만 이 포인터 값은 변하지 않는다.
                                        // 그러나 x1은 포인터 변수로 선언되었으므로 포인터 값이 변할 수 있다.
 
    for(i = 0; i<10; i++){              // 배열에 저장된 10개의 데이터를 순서대로 sum에 합한다.
                                        // 이때 x1의 값을 증가시킨다.
                                        // x1은 정수 포인터이며 정수포인터는 정수데이터의 저장크기 만큼인
                                        // 4씩 자동으로 증가한다.
                                        // 우리가 사용하는 PC는 바이트 단위 주소 지정방식을 사용하며,
                                        // 따라서 하나의 정수는 4개의 주소에 나누어 저장된다.
 
        sum += *x1;                     // 포인터 변수 x1을 증가시키면서 그 포인터가 가리키는 곳의 값(*x1)을 sum에 누적한다.
    }
    printf("sum = %d\n", sum);
 
    // 배열의 주소를 순서대로 출력해 보라. 그러면 4씩 증가하는것을 볼 수 있을것이다.
}



예제2 실행결과 :




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


#include 
 
// 행(ROW)과 열(COL)을 3,3으로 지정
#define ROW 3
#define COL 3
 
int main()
{
    // 정수 배열 x, y 선언 및 초기화
    int x[ROW][COL] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int y[ROW][COL] =  {9, 8, 7, 6, 5, 4, 3, 2, 1};
 
    // 결과가 저장될 배열 z선언
    int z[ROW][COL];
   
    int i, j, *x1, *y1, *z1;
 
    // 배열 x, y, z의 시작 주소를 포인터 변수 x1, y1, z1에 대입한다.
    x1 = &x[0][0];
    y1 = (int *)y;
    z1 = (int *)z;
 
    // 1차원적으로 x(x1), y(y1), 배열의 각 요소를 더해서 배열 z(z1)에
    // 저장한다. 각 포인터를 증가시키며 계산한다. 정수포인터는 4씩
    // 자동으로 증가한다. 프로그래머가 신경쓸 필요가 없다.
    for(i = 0; i < ROW*COL; i++, x1++, y1++, z1++)
        *z1 = *x1 + *y1;
 
    //포인터가 변했으므로 다시 z1의 포인터를 z의 시작주소로 바꾼다.
    z1 = (int *)z;
 
    //z1의 포인터를 증가하면서 계산 결과를 출력한다.
    for(i = 0; i < ROW; i++)
    {
        for(j = 0; j < COL; j++)
            printf("%3d ", *z1++);
        printf("\n");
    }
}


예제3 실행결과 :



반응형
Comments