• CSE207 객체지향 강좌 및 C++ 관련, 누구나 묻고 답하는 게시판 입니다.
  • CSE207 수강생이 아니여도 편안하게 질문하세요.
  • 첨부화일은 이미지 화일 혹은 zip 화일로 업로드 하기를 권합니다.

제목포인터 연산을 하기 전, 무엇을 할건지 먼저 정하세요.2019-04-13 09:31
작성자 Level 10

아래의 네가지 예제를 한줄 한줄 읽으면서, 머리로 이해해 보세요.

그리고 이해한 대로 프로그램이 동작하는지 실제로 수행해 보세요.


#include <iostream>


int main() {

    

    // case A: 1 dimensional array

    int array1[2] = {1,2};

    int *p1;

    

    p1 = array1;

    

    for(int i =0; i<2; i++) {

        std::cout << *(p1 + i) << " is " << p1[i] << std::endl;

    }

    

    // case B: 2 dimensional array with interger pointer

    int array2[2][2] = {{1,2},{3,4}};

    int *p2;

    

    p2 = (int *)array2;

    

    for(int i =0; i<4; i++) {

        std::cout << *(p2 + i) << " is " << p2[i] << std::endl;

    }


    // case C: 2 dimensional array with integer arrady pointer

    int array3[2][2] = {{5,6},{7,8}};

    int (*p3)[2];

    

    p3 = array3;

    

    for(int i =0; i<2; i++) {

        for(int j =0; j<2; j++) {

            std::cout << *(*(p3 + i) + j) << " is " << p3[i][j] << std::endl;

        }

    }

    

    // case D: 1 dimensional array with a different type pointer

    int arrayX[2] = {1,2};

    char *pX;

    

    pX = (char *)arrayX;

    

    for(int i =0; i<8; i++) { // single integer size is assumed as 4 bytes

        std::cout << (int) *(pX + i) << " is " << (int) pX[i] << std::endl;

    }

}


Case A는 1차원 정수 배열을 정수 포인터로 접근 하는 방식입니다. 참 쉽죠.


Case B는 2차원 정수 배열을 정수 포인터로 접근 하는 방식입니다. 강제로 casting을 하여, 포인터 p2는 2차원 배열을 강제로 1차원 배열처럼 접근합니다.


Case C는 2차원 정수 배열을 "정수 2개를 가지는 1차원 배열을 가리키는 포인터"로 접근 하는 방식입니다. 출력 구문을 보면, array3[i][j]와 p3[i][j]가 동일한 형태로 사용될 수 있지요. 아마도 본인이 게시판에 올린 글의 첫번째 프로그램에서 하고 싶었던 부분이 아니였나 싶습니다. 이때 포인터 변수 p3의 선언을 유의해서 봐야 하는데, 일단 괄호로 *p3를 감싼 이유는 p3가 포인터 변수로서 (괄호밖의) 정수 두개짜리 배열( = int[2])을 가리키겠다는 의미입니다. 


Case D는 포인터를 제대로 이해하고 있나 싶은 생각에 넣은 예제 입니다. Case B의 경우와도 일맥상통하는데, "int *p"는 1) p는 포인터 변수이다. 2) 포인터 변수 p가 가리키는 메모리는 이제 정수로 처리한다를 의미 입니다. 흔히 메모리에 정수가 있고, 이를 p로 가르킨다고 오해하기 쉬운데, C++이 메모리에 integer를 저장할때는 integer의 값을 제외하고 어떠한 정보도 없으니, 메모리 상에 정수가 있는지 다른 뭐가 있는지 알수가 없습니다. 따라서 Case D를 보면, 정수 2개를 가진 1차원 배열 arrayX가 있을때, 결국 (정수가 4바이트 라면) 총 8바이트의 메모리를 arrayX가 점유한 셈입니다. 별도로 만든 char *pX는 포인터 변수 pX가 가르키는 곳을 char로 처리 한다는 의미로서, 따라서, pX = (char *)arrayX 구문은 arrayX의 메모리를 pX가 1바이트씩 처리를 한다는 의미입니다.


포인터는 천천히 생각해서 개념을 확실하게 잡아두어야 합니다. 

그렇지 않고 사용하면 위험합니다.

댓글