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

zbqmgldjfh님의 프로필 이미지
zbqmgldjfh

작성한 질문수

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

10.14 2차원 배열과 포인터

10.14 질문이요!!

해결된 질문

작성

·

314

2

1)  4:20초 경 arr[0] 과 &arr[0] 이 배열에서 같은건 (맨 첫 주소일태니까) 다음 그림과 같이 이해하면 되는 것 일까요?

2) 4:23초 경 포인터의 배열에서는 달라질 수 있다는것이 어떠한 말이죠??

3) 책을 보다 관련된 것이 생각나 문의드려봅니다.

arr[0]은 첫번째 "원소" 의 주소이니 &arr[0][0]일것입니다. 그렇다면 *(arr[0])는 arr[0][0]에 저장된 값인 1이 될것입니다.

마찬가지로 *arr(포인터)은 첫번째 원소 arr[0]을 가리킬것 입니다. 그러나 arr[0]이 그자체로 &arr[0][0]이 되니, *arr은  &arr[0][0]을 포인팅할 것 입니다(? 맞나요?)

두 표현식에 각 참조연산자를 붙이면 **arr이 *&arr[0][0]을 가리킨다는 소린대 결과적으로 이는

**arr이 *arr[0][0]을 가리키나요?? 아니면 arr[0][0]을 가리키나요?? 수업때 알려주신대로 arr[0][0]이 맞죠?

C 기초 플러스(490p) 에서는 이를 *arr[0][0]이라 써놨던대 이거 그냥 arr[0][0]이 맞는것 이겠죠?

답변 8

4

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

우선 답변 잘 확인하였습니다!! 1번과 2번은 해결하였습니다.

다만 3번 답변에서 (  순서대로 따라가보았을 때 '**arr 가 &arr[0][0] 을 가리킨다.' 라는 결론에 도달할 수 없습니다. ) 라고 말씀하셨는대

저는 ( 두 표현식에 각 참조연산자를 붙이면 **arr이 *&arr[0][0]을 가리킨다. ) 라고 언급하였습니다.

저의 질문에는 &앞에 참조연산자(*)가 하나 더 있었는대 이를 확인 못하신것 같아 재질문 드립니다.

그리고 추가로 달아주신 답변도 잘 확인하였습니다 옳바른 지적에 감사합니다. 3번질문을 전반적으로 지적하신 부분을 고려하여 다시 올려봅니다.

(3번 수정질문) 

arr[0]은 첫번째 "원소" 의 주소이니 &arr[0][0]일것입니다. 그렇다면 *(arr[0])는 arr[0][0]에 저장된 값인 1이 될것입니다.

마찬가지로 *arr은 첫번째 원소 arr[0]의 값을 갖게될 것 입니다. 그러나 arr[0]이 그자체로 주소로서 &arr[0][0]이 되니, *arr은  &arr[0][0]이 됩니다(질문1 : 맞나요?)

두 표현식에 각 참조연산자를 붙이면 **arr이 *&arr[0][0]과 같다는 소린대(질문2 : 맞나요?)

결과적으로 이는 **arr은 *arr[0][0]이 되나요?? 아니면 arr[0][0]이 되나요?? (질문3 : 둘중 어느것?)

수업때 알려주신대로 arr[0][0]이 맞죠?

C 기초 플러스 6판(490p) 에서는 이를 *arr[0][0]이라 써놨던대 이거 그냥 arr[0][0]이 맞는 것 이겠죠?

2

사실 표현도 조금 수정하셨으면 좋겠는데...

int a = 5

int ptr = &a

일 때 ptr은 a를 가리킨다. 라고 보통 이야기하죠.

이건 *ptr 는 a에 저장되어 있는 값을 의미한다. 와 같은데

적으신대로 *arr 가 arr[0] 를 가리킨다 라는 것은

**arr 는 arr[0]에 저장되어 있는 값을 의미하게 되는 꼴이니 적절치 못한 표현이라 생각합니다.

2

안녕하세요?
질문에 많은 신경을 쓰시는 것이 느껴지는군요.

1. 은 옳은 생각입니다. 혹시 몰라서 더 적자면 simple array의 경우에 arr 가 &arr 와 같은 값을 출력하는 것과 같은 이유입니다.

2. 에 대해서는 저도 아래와 같은 시도를 해봤는데, 아직은 일반 변수의 배열과 포인터의 배열에서 다를 것이 없다는 생각이 드는군요.

강의의 마지막 부분을 이야기를 하시는건지 모르겠는데
배열에 대한 포인터의 경우에는 조금 다릅니다. 배열 자체에 대한 포인터이기 때문에
일반 포인터에서와 같이 pointer_to_array 는 가리키는 배열의 주소를 출력하고 &pointer_to_array는 포인터의 주소를 출력하게 됩니다.
강의 10:09~ 에서 참고하실 수 있습니다.


세번째 질문은 조금 헷갈리신 것 같은데 적으신 순서대로 따라가보았을 때 '**arr 가 &arr[0][0] 을 가리킨다.' 라는 결론에 도달할 수 없습니다. 다시 생각해보셨으면 좋겠습니다. 거의 다 오셨는데 살짝 틀렸네요.

저도 처음엔 이게 헷갈리는 부분이어서
arr[i] = *(arr+i)
(*arr)[4] // for 2d arr argument
arr[][4] // for 2d arr argument
이런 식으로 적어뒀던 기억이 나는군요.

1

저는 읽는 속도에 아무래도 차이가 있기 때문에 번역판도 나쁘지 않다고 생각합니다.
다만 용어는 반드시 영어로 된 표현도 함께 정리하시는 것을 권장해드리고 싶네요.
화이팅입니다.

1

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

좋은 답변 감사합니다!!

C 기초 프리미어 번역판을 보다 이런경험을 하니 진이 다 풀리내요 진짜 초심자인 저는 몇일을 계속 고민한건대 ㅠㅠ

영어를 아예 못하는 것도 아니니 그냥 KNK 원서를 읽으며 공부해야겠습니다!!! 감사합니다.!!

1

이제보니 그렇군요. 그렇다면 거기까지는 맞는 생각입니다.

#include <stdio.h>

int main()
{
	int a = 3;
	int* ptr = &a;
	
	printf("%d\n", **&*&*&ptr);
	
	return 0;
}

이런 시도를 해보세요. 3번을 헷갈리시는 이유가 여기서부터 온다고 생각합니다.

책은 제가 영문판 밖에 없어서 페이지가 매칭이 안되는 것 같습니다. Pointers and Multidimensional Arrays 부분을 훓어보았을 때도 이상한 점은 크게 없는 것 없네요. arr[0][0]이 맞고 나머지도 옳은 생각입니다.

0

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

넵 맞을거에요 말씀하신 식 모두 배열(a[0][0]) 하나를 나타낼것 입니다

0

그럼 3번 질문 결론이 

  **arr   ==    *arr[0]    ==    arr[0][0]

가 되는 건가요?

zbqmgldjfh님의 프로필 이미지
zbqmgldjfh

작성한 질문수

질문하기