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

chobocorder님의 프로필 이미지
chobocorder

작성한 질문수

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

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

15:00 부근에서 &parr[0]와 parr[0]가 왜 다른지 이해가 안됩니다.

작성

·

256

0

arr = arr[0] = &arr[0] = &arr[0][0] = parr[0]인건 알겠습니다. 그런데 똑같은 배열형태인데 &parr[0]와 parr[0]가 왜 다른지는 이해를 못하겠습니다.

 

15:30에서 강의에서는 이에 대한 자세한 이유를 알려주기 힘드니 10.1강의와 10.12강의를 보고 오라고 하셨지만 여기를 봐도 이곳에선 배열을 가지고 이중포인터를 소개하는게 아니고 int형 변수를 가지고만 설명을 해서 아무리 봐도 10.13의 15:00 부분이 잘 이해가 안됩니다.

 

답변 2

2

홍정모님의 프로필 이미지
홍정모
지식공유자

영상을 다시 봤더니 꼭 확인해보고 넘어가시라고 강조를 해놓은 부분이네요. 

int *parr[2];

에서 parr은 int 자료형에 대한 주소를 담을 수 있는 2개짜리 배열 parr[2] 입니다. 글로 적으면 복잡해 보이지만 결국 parr은 주소 두개 담을 수 있는 배열(=그 메모리 공간의 첫 주소)입니다. 그러니까 저장되는 값이 int가 아니라 주소입니다.

parr[0]은 거기에 저장되어 있는 주소값이고 &parr[0]은 주소값을 저장하는 메모리의 주소입니다.

주소값을 저장하는 변수의 주소라는 개념은 처음에는 당연히 헷갈리실 수 있습니다. 사람마다 이해하는 방법이 다르기 때문에 제 강의 앞부분을 보셨음에도 불구하고 아직 이해가 안가신다면 이중포인터 관련 자료들을 더 찾아서 보시는 것을 권장합니다.

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

감사합니다

1

안녕하세요 :)

arr와 arr[0]는 다릅니다.

arr는 arr[0]의 주소를 가리키고 있는 것이지요.

달리 말해 arr는 arr[0]와 같은게 아니라 arr[0]의 주소와 같습니다.

 

아래 코드를 직접 돌려보며 확인해보세요.

#include <stdio.h> 
int main() { 

	int arr[2] = { 1, 2 };

	printf("%p\n", arr[0]);
	printf("%p\n", arr);
	return 0; 

}

 

 

마찬가지로

parr[0]는 parr가 저장하고 있는 첫 번째 원소 자체(parr가 저장하고 있는 첫 번째 포인터)를 의미하고, &parr[0]는 그 주소를 의미합니다. 

 

혹시 이해가 안가신다면 댓글 달아주세요 :)

 

감사합니다.

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

printf("%p\n", &parr[0]); // 다른 주소값을 출력

printf("%p\n", parr[0]);         

printf("%p\n", arr);                 

printf("%p\n", &arr[0]);        

printf("%p\n", arr[0]);          

printf("%p\n", &arr[0][0]);  

 

강의에 나와있는 코드입니다 저기서 첫번째줄을 제외하고는 전부 같은 주소값을 출력하는 것은 이해했습니다. 그런데 &parr[0]와 parr[0]의 주소를 출력하는 값이 서로 다르다는 것이 이해가 안갑니다.

똑같이 배열 형태인 &arr[0]의 주소값과 arr[0]의 주소값은 같은데 말이죠.

chobocorder님의 프로필 이미지
chobocorder

작성한 질문수

질문하기