ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 포인터와 배열2
    프로그래밍/C, C++ 2019. 4. 21. 23:22
        int arr[4] = {1,2,3,4};
        int *p = arr; //배열의 이름이 시작주소

    여기서 p[0]의 값은 무엇일까?

    마이크로소프트의 C++을 보면

    [] 연산자에서 구문적 요구 사항은 식 중 하나가 포인터 형식이고
    다른 하나는 정수 계열 형식이어야 한다는 것 밖에 없습니다


    그리고 예제를 보면

        int nArray[5] = { 0, 1, 2, 3, 4 };
        cout << nArray[2] << endl;          
        cout << 2[nArray] << endl; 

    이런 이상한 코드가 있고 둘다 같은 값을 출력합니다.

    []연산자를 사용할 때는, 하나의 포인터와 하나의 정수만 있으면 다 성립한다고 했습니다.

    arr은 배열의 이름이므로 주소를 나타내고 포인터입니다.
    그래서 포인터 변수에 & 연산자 없이 들어갈 수 있고요


    arr[0]는 따지고 보면 arr 이라는 포인터에 가리키고있는 변수의 크기만큼 0번 뛰어라라고 볼 수 있습니다!
    위의 예제에서는 int형을 가리키고 있기 때문에 4바이트만큼 0번 뛴 것의 값와 주소와 더한 후, 참조한 값을 보여줍니다.

    결국에는 *(arr+0)와 arr[0]은 완벽하게 같은 동작을 합니다.
    그래서 nArray[2] 와 2[nArray]는 *(nArray + 2)와 *(2 + nArray)로 바뀌기 때문에 에러없이 출력을 합니다


    우리 예제에서는 p는 arr과 같으므로 arr[0]는 p[0]와 같습니다


    정리

    *(p + 0) == p[0]

    이거 한문장으로 정리가 될 것 같습니다!

    예시

        int arr[2][4] = { {1,2,3,4}, {5,6,7,8} };
        // int arr[2][4] = {int [4], int[4]}; 이해를 돕기 위한 코드
        int (*p)[4] = arr;
        printf("%d", p[0][3]) // 4
        printf("%d", p[1][2]) // 7

    위에 코드가 이해가 안되면, 그낭 p에 arr을 대입을 해보시면 좋습니다.
    p는 arr을 가리키고 있고, p[0]는 arr[0]과 같고, p[0][3]은 arr[0][3]과 같습니다!

    p[1][2]의 경우는, p[1]는 *(p + 1)이므로 p가 참조하고 있는 int [4]의 크기만큼 1칸을 뜁니다
    그 후, p[1]는 int형을 가리키고 있기 때문에, p[1][2] 는 int의 크기만큼 4만큼 2칸을 뜁니다.

    따라서 7을 출력합니다.



    질문이나 잘못된 점을 댓글 달아주시면 바로 피드백하겠습니다!

    '프로그래밍 > C, C++' 카테고리의 다른 글

    포인터 타입 캐스팅  (0) 2019.04.30
    함수 포인터  (0) 2019.04.26
    포인터와 배열1  (0) 2019.04.21
    포인터 연산  (0) 2019.04.17
    포인터 기본  (0) 2019.04.16

    댓글

Designed by Tistory.