inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

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

해결된 질문

393

용개형멋져

작성한 질문수 37

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]이다.

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

 

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

c

답변 3

2

Soobak

안녕하세요, 질문&답변 도우미 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]을 붙인거라고 생각해도 괜찮을까요?

2

Soobak

네 맞습니다.


&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 인턴입니다.

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언어의 포인터와 배열에 대한 추가적인 자료를 참조하시길 권장합니다.

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

1

용개형멋져

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

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

2

Soobak

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

 

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

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

 

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

Export template 안됨

1

18

2

완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.

1

54

3

main 함수에서 왜 int만 선언이 되는걸까요

1

56

2

8비트 2진수 변환시 왜 1을 더해야하나요?

1

54

2

혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?

1

49

1

프로토타입과 함수간의 인자 불일치

1

73

2

12.12 헤더 관련 질문

1

60

2

Visual Studio Community 2026 사용 문의

1

137

2

Q. 15:30, 부호가 있는 8비트 정수 질문

1

61

2

getchar(), putchar()

1

93

3

강의자리ㅛ

1

79

2

비주얼스튜디오코드로 공부해도 상관없나요?

1

113

2

소스파일안에 여러 파일

1

75

2

F5와 F7의 차이

1

76

2

c = TWO * (a+b); 에서 a와 b는?

1

58

2

; 세미콜론을 붙이는 기준에 문의

1

69

1

Step over 기능 문의

1

53

2

2.6 강의 따옴표 출력 규칙 문의

1

74

2

int main 함수 관련 오류 문의

1

67

2

13.4 words[0]

0

60

2

11.7 함수를 구현해 봤습니다.

1

62

2

11.6 직접 strcmp와 strncmp를 구현해 보았습니다.

1

65

2

11.6 my_strcat과 my_strncat을 구현해봤습니다.

1

53

2

11.6 fit_str함수를 구현해 봤습니다.

1

53

2