• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

9분 48초 (*(parr + 1))[1] 이게 이해가 잘 안되네요

24.01.28 21:19 작성 24.01.28 21:33 수정 조회수 189

2

(*(parr + 1))[1]을 제가 해석해보자면

parr은 arr0을 가리킨다. 거기에 1을 더하면 arr1을 가리키게 된다.

거기에 *를 붙이면 arr1이 가리키는 arr1[0]을 가리키게 된다.

여기에 [1]를 붙이면? arr1[0][1]을 가리키게 되나? 아니면 arr1[1]을 가리키게 되나? 아니면 arr1[1]이 되나?

출력값이 5인걸 보면 맨 오른쪽인것 같은데

(*(parr + 1))은 &arr1[0]이고 거기에 [1]을 붙인다는 게 정확하게 무슨 뜻 인가요?

어떤 식으로 작동하는건지 이해가 잘 안되요.

 

parr[0]은 &arr0[0]이고

parr[0][0]은 arr0[0]이다.

라는 것과 비슷하게 작동하는 건가요?

 

항상 좋은 답변 감사합니다.

답변 3

·

답변을 작성해보세요.

2

Soobak님의 프로필

Soobak

2024.01.28

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

 

[1] 인덱싱 접근은 포인터 연산에서의 +1 로 생각하시는 것이 이해에 도움이 되실 것 같습니다.
실제로 배열에 대한 인덱싱 접근은 내부적으로 포인터 연산을 사용합니다.

 

질문을 위해 설명해주신 내용은 모두 정확하십니다.

parrarr0 을 가리키는 포인터 배열입니다.
parr + 1 은 포인터 배열의 다음 원소를 가리키므로, arr1 을 가리키게 됩니다.
*(parr + 1)parr + 1 이 가리키는 값을 역참조하므로, arr1 배열의 시작 주소, 즉 &arr1[0] 을 얻게 됩니다.
여기에 [1] 을 추가하면, arr1 배열의 시작 주소에서 한 원소 뒤를 가리키게 됩니다.
(위에서 설명드린 포인터 연산 +1 을 생각해보시면 좋을 것 같습니다.)
따라서, arr1[1] 을 가리키게 됩니다.

2

&arr1[0]은 parr[1]이고 거기에 [1]을 붙인거라고 생각해도 괜찮을까요?

Soobak님의 프로필

Soobak

2024.01.28

네 맞습니다.


&arr1[0]arr1 배열의 첫 번째 원소의 주소를 의미하며, 이는 parr[1] 과 동일합니다.
parr 이 포인터의 배열을 가리키는 '포인터 배열' 이므로, parr[1] 은 두 번째 배열, 즉 arr1 의 시작 주소를 가리키게 되기 때문입니다.

따라서, parr[1][1] 을 사용하여 arr1[1] 에 접근하는 것과 같이, (*(parr + 1))[1] 을 사용하여 arr1[1] 에 접근하는 것은 동일한 결과를 나타냅니다.
여기서 *(parr + 1)parr[1] 과 같고, 이후 [1] 을 추가하면 배열의 두 번째 요소에 접근하게 됩니다.

요약하자면, &arr1[0]parr[1] 로 생각하시고, 그 다음에 [1] 을 추가하는 것으로 arr1[1] 에 접근한다고 생각하신 것도 올바른 이해입니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.01.28

안녕하세요, 인프런 AI 인턴입니다.

berorowulf님, 포인터와 배열의 관계에 대해 질문해 주셨군요. 이는 C언어에서 포인터 연산과 배열 접근 방식을 이해하는 데 있어 매우 중요한 부분입니다.

공유하신 내용에는 이미지 URL이나 원본 URL 정보가 없어서, 직접적인 링크를 제공할 수는 없지만, 질문자님이 참조할 수 있는 유사한 주제에 대한 답변이 있습니다.

10.14 2차원 배열과 포인터 04:40“에서는 a[0][0]이 **arr과 동일한 이유가 설명되어 있으며, 이를 통해 2차원 배열과 포인터 관계를 이해하는 데 도움이 될 수 있습니다.

10.13 포인터의 배열과 2차원 배열 07:24“에서는 포인터 배열과 2차원 배열을 이해하는 질문에 대한 답변이 제공되어 있고, 이 또한 포인터 연산과 배열간의 관계를 이해하는 데 유용합니다.

10.13 포인터의 배열과 2차원 배열” 사례는 &parr[0]parr[0]이 다른 이유에 대한 설명을 담고 있습니다. 이는 배열과 포인터의 차이를 나타내며, 포인터 연산을 이해하는 데 기여할 수 있습니다.

berorowulf님의 질문에서 (*(parr + 1))[1]에 대한 이해가 필요하신 것 같은데, 이 표현은 다음과 같은 의미를 가집니다:

  1. parr + 1: parr은 배열 arr0의 첫 번째 원소의 주소를 의미하므로, 이는 arr1의 첫 번째 원소의 주소로 이동합니다.
  2. *(parr + 1): 이는 위에서 이동한 주소에 해당하는 값, 즉 arr1 배열 자체를 의미합니다.
  3. (*(parr + 1))[1]: arr1 배열의 두 번째 원소, 즉 arr1[1]을 의미합니다.

포인터 연산과 배열의 접근 방식에 대해 좀 더 정확히 이해하시려면 강의의 해당 부분을 다시 확인하시거나, C언어의 포인터와 배열에 대한 추가적인 자료를 참조하시길 권장합니다.

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

*(parr + 1): 이는 위에서 이동한 주소에 해당하는 값, 즉 arr1 배열 자체를 의미합니다.

라고 했는데 arr1 배열 자체를 의미 하는 게 아니라 &arr1[0]를 의미하는게 아닌가요?

Soobak님의 프로필

Soobak

2024.01.28

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

 

C언어에서 배열의 이름은, 배열의 첫 번째 원소의 주소로 해석되고는 하므로, 둘은 같은 결과값을 가집니다.

arr1 이라는 배열의 이름에 대한 표현을 풀어보면, 배열의 첫 번째 요소인 arr1[0] 의 주소를 나타내며, 동시에 이는 &arr1[0] 과 동일합니다.

 

하지만, 질문자님께서 댓글로 말씀해주신 것 처럼 *(parr + 1)arr1 은 배열의 첫 번째 원소의 주소 &arr1[0] 을 의미한다는 것이 좀 더 명확한 표현입니다.
(arr1 배열 자체를 직접 의미하는 것이 아니라, 배열의 첫 번째 원소를 가리키는 주소를 의미한다는 것이므로)