• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

7분 28초경 질문

24.02.21 23:44 작성 조회수 181

2

저번에 아무 생각 없이 지나쳤던 부분을

복습을 하면서 다시 보니 뭔가 이상해서 질문을 드립니다.

교수님이 arr2d를 인디렉션을 하면 arr2d[0]이 나온다고 하셨는데

저 생각으로는 &arr2d[0][[0]이 나오거든요

아마 제가 틀린걸거라고 생각은 하는데 교수님 말씀이 잘 이해가 안되네요

arr2d는 &arr2d[0]이고(arr2d[0]을 가리키고)

arr2d[0]은 &arr2d[0][0]이니(arr2d[0][0]을 가리키니)

arr2d를 인디렉션하면 &arr2d[0][0]이 나오는 게 제 생각에서는 맞는건데...

제가 지금까지 공부하면서 만든 복습노트를 봐도 제 생각에서는 &arr2d[0][0]이 맞는데

역시 제가 틀린거겠죠?

아니면 교수님 설명을 제가 다른 뜻으로 이해를 한 것 인가요?

답변 2

·

답변을 작성해보세요.

2

Soobak님의 프로필

Soobak

2024.02.22

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

 

arr2d 는 2차원 배열의 시작 주소를 나타내며, 이는 &arr2d[0] 과 동일합니다.
즉, arr2d 는 첫 번째 '행' 의 시작 주소를 가리킵니다.

arr2d[0] 은 첫 번째 행을 나타내며, 이것 자체가 또한 1차원 배열입니다.
따라서, arr2d[0] 의 주소는 &arr2d[0][0] 과 같습니다.

다만, 포인터의 자료형과 관련하여, *arr2darr2d[0] 을 가리킨다고 표현하는 것이 더 적절합니다.

포인터의 자료형과 관련하여, *arr2darr2d[0] 을 가리킨다고 표현하는 것이 더 적절합니다.

라는 말씀이 아예 이해가 안됩니다.

indirection이 포인터 변수가 가리키는 변수의 메모리 공간에 접근하는 거라고 하면

arr2d는 arr2d[0]을 가리키고 arr2d[0]의 메모리 공간에는 &arr2d[0][0]이 있으니
(실제로 arr2d[0]은 메모리 공간도 없고 &arr2d[0][0]이 있는 게 아니지만 포인터의 배열과 2차원 배열을 이해하기 쉽게 하기 위해 실제와는 다르지만 비슷한 구조라고 생각하고 있습니다)

*arr2d는 arr2d[0][0]을 가리키는 거라고 생각하고 있는데...

일단 제 생각도 맞고 교수님 말씀도 맞는데 포인터 자료형과 관련해서는 교수님의 말씀이 더 적절하다는 말씀 맞나요?

근데 포인터 자료형과 관련에서는 arr2d[0]을 가리킨다고 표현하는 게 더 적절하다라고 말씀하시는 게 하나도 이해가 안되네요 ..

구글 제미니나 챗지피티에 질문해봐도 이해가 잘 안되네요 도와주세요 ㅠㅠ

Soobak님의 프로필

Soobak

2024.02.22

다차원 배열에서 포인터와 배열, 그리고 자료형의 관계를 이해하는 것이 중요하기 때문에,

포인터의 자료형과 연산의 관점에서 arr2d 가 가리키는 대상이 arr2d[0] 이라는 점을 강조드린 것입니다.

포인터는 기본적으로 '주소' 를 가리키지만, 가리키는 주소에 존재하는 변수의 자료형 또한 중요합니다.

강의 중 예시에서 arr2d 의 자료형은 int [2][3] 타입의 2차원 배열입니다.
이 때, 배열의 이름은 포인터와 호환이 되는 형태로 사용될 수 있으므로, 배열의 첫 번째 원소인 arr2d[0] 의 주소로 암시적 변환이 될 수 있습니다.

이 때, arr2d 의 포인터로서의 자료형은 int (*)[3] 타입입니다.

즉, arr2d3 개의 int 를 갖는 배열의 포인터라는 부분에서 위와 같이 말씀드린 것입니다.

배열과 포인터, 그리고 자료형에 대해서 생각해보시면 이해에 도움이 되실 것 같습니다.

포인터의 자료형과 연산의 관점에서 arr2d 가 가리키는 대상이 arr2d[0] 이라는 점을 강조드린 것입니다.

에서 포인터의 자료형과 연산의 관점에서 라는 말씀은 이해를 잘 못했지만

그 외의 말씀은 이해를 했습니다.

그래도 그래도 *arr2darr2d[0] 을 가리킨다고 표현하는 것이 더 적절합니다.

라는 말씀이 이해가 안됩니다.

arr2d가 arr2d[0]을 가리킨다는건 이해가 되는데

이미 arr2d가 arr2d[0]을 가리키는데 거기서 인디렉션을 했을때 똑같이 arr2d[0]을 가리킨다?

라는게 이해가 안되는 것 같습니다.

답변하시느라 힘드실텐데 정말 ㅈㅅ합니다 ㅠㅠ

Soobak님의 프로필

Soobak

2024.02.22

안녕하세요, 질문은 편하게 주세요.

얼마든지 괜찮습니다.

열심히 공부하시고 궁금하신 점이나 이해가 어려우신 부분을 편히 질문해주시면,
질문자님께서 분명히 나중에 훌륭한 개발자로 성장하실 것이기 때문에, 저 또한 뿌듯하고 좋습니다.

 

  1. 예를 들어 int arr2d[2][3] 선언된 2차원 배열에서 arr2d (배열의 이름)는 2차원 배열을 가리키는 포인터와 호환이 되는 형태로, arr2d 의 타입은 int (*)[3] 이 됩니다.
    즉, arr2dint[3] 타입의 배열을 가리키는 포인터입니다.

 

  1. arr2d 가 가리키는 것은 첫 번째 행의 시작 주소 입니다.
    즉, 첫 번째 int[3] 배열이며, 이를 arr2d[0] 으로 표현할 수 있습니다.


    따라서, "arr2darr2d[0] 을 가리킨다" 고 할 수 있습니다.

 

이 때, 포인터의 자료형이 중요해지는데요, "*arr2darr2d[0] 을 가리킨다" 고 하는 것은, 포인터 자료형과 관련하여 표현을 정확하게 하기 위함입니다.

*arr2d 는 최종적으로 arr2d[0][0] 의 값을 가리키지만, arr2d 의 타입이 int (*)[3] 이므로, *arr2dint[3] 타입의 배열을 나타내며, 이는 arr2d[0] 입니다.

 

이러한 관점은 가장 마지막 댓글에서 이해가 어렵다고 해주신 '포인터 자료형과 포인터 연산'과 관련이 있는데요.

 

이전 강의(12.13 포인터와 2차원배열)를 복습해보셔도 좋고, 해당 강의에서 다룬 일부 내용에 대한 다른 수강생 분의 질문 링크 글 또한 도움이 되실 것 같아 첨부드립니다.

따배씨 질문 -포인터 2차원배열(링크)

몇 일만에 드디어 이해를 했습니다 수박님 정말 감사합니다!

-3

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.02.21

안녕하세요, 인프런 AI 인턴입니다. berorowulf님, 2차원 배열과 포인터에 대한 질문이시네요.

제공된 링크들에는 다루고 있는 주제가 비슷하지만, 질문자님이 구체적으로 언급한 “arr2d를 인디렉션하면 arr2d[0]이 나오는데, 왜 &arr2d[0][0]이 나오는 것이 아닌가”와 관련된 직접적인 해결책은 포함되어 있지 않은 것으로 보입니다.

하지만, 주제가 비슷하기 때문에 참고하실 만한 특정 답변을 알려드리고자 합니다.

먼저, 10.14 07:48 **arr2d가 어떻게 arr2d[0][0]이 되는지 이해를 못하겠습니다. 이 질문에서는 2차원 배열 이름이 1차원 배열의 첫 번째 요소를 가리킬 때 발생하는 현상에 대해 혼란을 느끼고 질문하였습니다. 제목이나 내용을 보면, 질문자님이 궁금해하는 부분과 유사한 내용이 다뤄졌을 가능성이 있습니다.

또한, 강의 초반 질문 에서는 배열에 관한 포인터 표현식에 대한 질문이 있었고, 4:30에서 arr+1=arr[1]? 에서는 2차원 배열을 다룰 때 발생하는 주소 연산에 대한 질문이 있었습니다. 이것들은 배열과 포인터의 상호 작용에 대한 이해를 돕는데 일부 도움이 될 수 있을 것입니다.

berorowulf님이 이해하는 바에 따르면, arr2d의 인디렉션 결과가 &arr2d[0][0]로 느껴지나, 실제 C언어에서는 배열 이름이 주소를 나타내는 포인터로 쓰일 때, arr2d는 첫 번째 ‘행’(arr2d[0] 또는 &arr2d[0][0])을 가르킵니다. arr2d[0]의 경우 이것이 1차원 배열로 행동하기 때문에 포인터를 통한 인덱싱(arr2d[0][i])이 가능한 것이죠.

이 부분에 대해 더 확실한 이해를 원하시면, ‘포인터 배열과 가리키는 대상’, ‘주소 연산을 할 때 일어나는 현상’, ‘2차원 배열 역참조의 결과’ 등에 대해 집중적으로 공부하시는 것을 추천합니다. 질문하신 부분을 명확하게 파악하시려면, 해당 강의의 시점을 정확하게 지칭하시고, 가능하다면 코드 예시와 함께 질문하시면 좀 더 명확한 답변을 얻으실 수 있을 겁니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.