작성
·
292
1
교수님께서 강의를 해 주실때
ar1[2][3]은 3개짜리이고, ar2[3][2]는 두개짜리라고 말씀해주셨습니다.
하지만 저는 반대로 ar1은 [3]개의 원소를 담은 배열이 '2개', ar2는 [2]개의 원소를 담은 배열이 '3개'라고 이해하였습니다.
array에서 두번째 차원의 원소의 수와 포인터의 사이즈가 같아야 하는건가요??
답변 3
0
안녕하세요,
아까 제가 그림과 함께 답변해드린 내용을 정정합니다.
혼란을 드려 죄송합니다.
배열 포인터를 이차원 배열에 할당할 때 포인터 연산시 증감하는 크기를 기준으로 생각해보시면 됩니다.
배열 포인터는 포인터 연산 시 행의 길이만큼 증가합니다.
가령 아래 예제를 보시면, 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
0
네 답변 감사합니다!
저도 그림을 그려주며 설명해주신 것처럼 생각을 하고 있습니다. 그런데 강의에서는 그와 반대로 설명이 진행되는 것 같습니다.
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] 이 작동한다는 것입니다. 감사합니다.