인프런 커뮤니티 질문&답변

chang님의 프로필 이미지

작성한 질문수

홍정모의 따라하며 배우는 C언어

10.15 포인터의 호환성

8:46~9:07

22.04.05 16:54 작성

·

264

1

교수님께서 강의를 해 주실때

 

 

ar1[2][3]은 3개짜리이고, ar2[3][2]는 두개짜리라고 말씀해주셨습니다.

하지만 저는 반대로 ar1은 [3]개의 원소를 담은 배열이 '2개', ar2는 [2]개의 원소를 담은 배열이 '3개'라고 이해하였습니다.

array에서 두번째 차원의 원소의 수와 포인터의 사이즈가 같아야 하는건가요??

 

답변 3

0

강민철님의 프로필 이미지

2022. 04. 05. 22:58

안녕하세요,

아까 제가 그림과 함께 답변해드린 내용을 정정합니다.

혼란을 드려 죄송합니다.

 

배열 포인터를 이차원 배열에 할당할 때 포인터 연산시 증감하는 크기를 기준으로 생각해보시면 됩니다.

배열 포인터는 포인터 연산 시 행의 길이만큼 증가합니다.

가령 아래 예제를 보시면, pa[0]는 0xffffec2c10a0

pa[1]는 0xffffec2c10a8

로 모두 int 두 개 크기(8바이트)만큼 증가한 것을 알 수 있습니다.

 

#include<stdio.h>

int main()
{
        int ar2[3][2] =
        {
                {1, 2},
                {3, 4},
                {5, 6}
        };

        int (*pa)[2];

        pa = ar2;

        printf("%p\n", pa);  // 0xffffec2c10a0
        printf("%p\n", pa+1);  // 0xffffec2c10a8

        return 0;
}

 

비슷한 예로 아래 코드의 경우 pa 포인터는 포인터 연산시 12바이트씩 증감합니다.

 

#include<stdio.h>

int main()
{
        int ar2[2][3] =
        {
                {1, 2, 3},
                {4, 5, 6},
        };

        int (*pa)[3];

        pa = ar2;

        printf("%p\n", pa); // 0xfffff824dcd0
        printf("%p\n", pa+1); // 0xfffff824dcdc


        return 0;
}

 

즉, 이차원 배열을 저장하는 포인터 배열은 

포인터 연산시 증가하는 크기 만큼 (다시 말해 가로 길이만큼) 

선언해주면 됩니다.

일전에 그려드렸던 그림보다는 아래 그림이 더 적절해 보입니다.

 

 

즉, int (*ptr)[2]는 "포인터 연산을 할 때 int 형 자료형 두 개만큼" 증감한다.

즉, int (*ptr)[3]는 "포인터 연산을 할 때 int 형 자료형 세 개만큼" 증감한다.

라고 생각하면 됩니다.

포인터 배열은 포인터 연산 증감크기만 맞춰준다면 아래와 같이도 연산할 수 있습니다.

 

#include<stdio.h>

int main()
{
        int ar2[10000][3] =
        {1, };

        int (*pa)[3];

        pa = ar2;



        return 0;
}

 

 

 

이와 관련하여 아래 링크에 자세히 안내되어 있으니 

참고하시기 바랍니다.

http://www.tcpschool.com/c/c_pointerArray_arrayPointer

https://dojang.io/mod/page/view.php?id=312

 

감사합니다.

 

===========================

(추가)

아래에 새로이 질문글을 남겨주셨군요..!

https://www.inflearn.com/questions/498987

잘못된 그림이 혼동을 야기할 수 있으니 위 질문글은 삭제 부탁드립니다,

혼란을 드려 죄송합니다.

감사합니다.

0

강민철님의 프로필 이미지

2022. 04. 05. 17:29

삭제된 글입니다

chang님의 프로필 이미지
chang
질문자

2022. 04. 05. 17:40

네 답변 감사합니다!

저도 그림을 그려주며 설명해주신 것처럼 생각을 하고 있습니다. 그런데 강의에서는 그와 반대로 설명이 진행되는 것 같습니다.

9분 14초를 보시면, ar2를 pa에 담을 수 없는 이유가 (원소의 수가) "2개니까"라고 말씀하십니다.

 

보시면 int(*pa)[3]으로써, 설명해주신 "ar2는 배열의 원소가 두 개짜리인 배열이 세 개 입니다."를 따른다면 int(*pa)[3]은 배열 세 개를 가리킬 수 있는 포인터입니다.

 

int(*pa)[2]로 바꿔준 후 -> ar2[3][2]를 pa에 넣어주면 정상적으로 작동합니다.

 

==============================================================

민철님께서 바로 위에서 그림을 통해 설명해주셨는데, 강의에서는 ar[2][3]이 정상적으로 들어갈 때는 int(*pa)[2]가 아니라,  int(*pa)[3]일 때 입니다.

지금 문제점은, 저 또한 민철님께서 그려주신 것과 동일하게 int(*pa)[2]에서 ar[2][3]이 작동해야 한다고 이해하고 있지만 강의에서는 이와 반대로 int(*pa)[3]일때 ar1[2][3] 이 작동한다는 것입니다. 감사합니다.

 

0

chang님의 프로필 이미지
chang
질문자

2022. 04. 05. 17:10

아직 제가 이해하지 못한 게, 이렇게 x[3][4]를 보면 4개짜리 원소들을 담은 배열이 3개가 있다고 이해했습니다.

 

선언하는 부분에서는 이게 다른 건가요??

chang님의 프로필 이미지

작성한 질문수

질문하기