C ++ 배열과 포인터 *연산 관련 질문입니다

조회수 831회
#include <stdio.h>
#include <conio.h>

int main()
{
    int a[3][5] = {
        {1, 2, 3, 4, 5},
        {6, 7, 8, 9, 10},
        {11, 12, 13, 14, 15}
    };
    printf("%d", (a + 1));
    printf("\n%d", *(a + 1));
    _getch();

}
위 코드에서 첫번째 printf의 결과와 두번째printf의 결과가 같게 나오는데, 
왜 같게 나오는지 이해가 안되네요. 

*(a + 1)의 의미는 "포인터 (a + 1)이 가리키고 있는 번지에 들어있는 값을 읽어라." 인데 
그 결과(번지에 들어있는 값을 읽은 결과)가 a[1]의 번지값이었습니다. 
즉 포인터 (a + 1)이 가리키고 있는 번지에 들어있는 값은 a[1]의 번지값이다. 
다시 말해 (a + 1)는  'a[1]의 번지값을 가지고 있는 무언가'의 번지값을 가지고 있다는 뜻인데.... 
말이 안되지 않나요? a의 번지에 +1을 했다는 것은 a의 번지에 4*5바이트 만큼 갔다는 뜻인데,  
거기에 있는게 'a[1]의 번지값을 가지고 있는 무언가'의 번지값이라뇨. 
제가 분명히 뭔가를 잘못 이해하고 있는 것 같은데, 블로그를 읽어봐도 알수가 없네요.
(문장을 헷갈리게 써서 죄송합니다. 근데 제 의문을 표현하려면 어쩔 수 없는 것 같네요.)

1 답변

  • 1차원 배열이라면 다른값이 나왔을 것입니다. 그런데 위에서 a는 2차원 배열입니다.

    그래서 다음을 보면

    #include <stdio.h>
    
    int main(){
        int a[3][5] = {
            {1, 2, 3, 4, 5},
            {6, 7, 8, 9, 10},
            {11, 12, 13, 14, 15}
        };
    
        printf("%d", a[1][2]);    //다음과 같이 출력을 합니다.
        a[1]   //그러므로 다음은 포인터 입니다.
        a[1]=*(a+1)    //[]연산자는 다음과 같습니다.
        a    //이것도 포인터 입니다.
        a+1    //따라서 이것도 포인터 입니다. 
    }
    
    

    그리고 두 값 모두 처음에서 1*3 떨어진 만큼을 가리키고 있으므로 같은 값을 갖습니다.

    보충설명을 하자면 2차원 배열에서는 2개의 *연산자를 써야 합니다.

    말이 꼬인것 같은데 이해하셨겠죠?

    • 이해못했어요! array[i] 와 *(array + i)가 같다는 것이 1차원 배열에서는 완벽히 이해가 가는데 array[3][5]에서 array[1]과 *(array + 1)이 왜 같은지 모르겠어요. array[1]은 배열의 이름으로써 포인터 상수일텐데 *(array + 1)이란건 포인터 상수에 *연산을 한 거니까 포인터 상수가 아니라 번지에 들어있는 "값"을 의미하는거 아닌가요? 알 수 없는 사용자 2018.2.22 23:22
    • 아 []연산자는 오버로딩이 되지 않는 이상 *(a+b)=a[b]입니다 buttercrab 2018.2.22 23:38
    • 아.... *(a+1) 연산에 의해 읽혀지는 값이 정수형이 아니라 정수배열형이라는 것을 몰랐네요... 알 수 없는 사용자 2018.2.23 00:33

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)