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

정진호님의 프로필 이미지
정진호

작성한 질문수

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

10.13 포인터의 배열과 2차원 배열

int* 만큼 이동한다는 말의 뜻이 궁금합니다.

해결된 질문

작성

·

205

2

안녕하세요,

이전 질문글의 답변에서 궁금한 점이 있어 질문드립니다. 링크는 https://www.inflearn.com/course/lecture?courseSlug=following-c&unitId=28273&tab=community&category=questionDetail&q=1142021
이고, 스샷으로 가져왔습니다. 밑줄 친 부분이 이해가 잘 가지 않는데요,

밑줄.jpg

arr 배열의 원소타입이 int 이므로 , arr + 1 은 arr[1]을 가리키는 포인터의 위치로 이동한다는 건 잘 알겠습니다.
arr, 즉, arr[0]의 주소가 만약 100이면 104 로 이동하겠죠. int 크기가 4바이트니까요.

그렇다면, parr + 1도 int* 크기만큼 이동해야 할 것 같은데요, int* 는 주소값을 저장하는 타입이므로 주소값의 크기인 4바이트(혹은 운영체제에 따라 8바이트) 만큼 이동해야 할 것같은데, 하기 첨부한 그림을 보면 parr[0] 시작 주소 부터 parr[1] 시작 주소까지 12바이트를 이동합니다.

직관적으로는 그럴것 같은데 헷갈려서 질문드립니다. 감사합니다.

 

답변 1

2

안녕하세요, 질문&답변도우미 Soobak입니다.

 

포인터를 원소로 갖는 배열(포인터의 배열)에서, 포인터 원소의 주소(포인터 변수의 주소)와 포인터 원소가 가리키는 주소(포인터 변수의 값)는 다르다는 부분을 생각해보시면 이해에 도움이 되실 것 같습니다.👍

 (첨부해주신 강의 그림에서는, parr[0] 의 주소와 parr[0] 이 가리키는 주소, parr[1]의 주소와 parr[1]이 가리키는 주소 의 구분)

 

 

또한, 링크해주신 질문 글은 해당 강의 9:20 부분,

int arr0[3] = {1, 2, 3};

int arr1[3] = {4, 5, 6};

int* parr[2] = {arr0, arr1}

 

으로 선언된 parr 에 대한 내용으로, 질문해주신 2차원 배열에 대한 포인터 연산과 조금 다른 경우입니다.

정진호님의 프로필 이미지
정진호
질문자

수박님 안녕하세요, 답변주신 내용 중 궁금한게 있어 질문드립니다.

image.png여기서 parrr[0]의 주소와 parr[0]가 가리키는 주소를 생각해보라고 하셨습니다.

포인터 원소가 가리키는 주소와 포인터 변수의 값이 같다고 하셨습니다. 하지만,

parr은 포인터 변수의 배열로 선언되었기 때문에 각 원소가 포인터 변수이여야 하나, parr의 원소들인 arr[0]와 arr[1]은 포인터 변수가 아니지 않나요? 다만 arr이 배열이기때문에 포인터 변수와 호환이 되는 형태로 쓰는 것 아닌가요? 포인터 '변수'가 아닌데 어떻게 주소를 갖는건지 모르겠습니다.

안녕하세요,

 

parr 의 각 원소는 int* 타입의 포인터입니다.

parr[0]parr[1] 은 포인터 변수입니다.

arr0arr1 은 말씀하신 것처럼 배열의 첫 번째 원소의 주소를 나타내는 포인터와 호환이 되는 형태이기 때문에, parr[0] 에는 arr0 의 주소가 저장되고, parr[1] 에는 arr1 의 주소가 저장됩니다.

정진호님의 프로필 이미지
정진호

작성한 질문수

질문하기