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

강진성님의 프로필 이미지
강진성

작성한 질문수

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

10.14 2차원 배열과 포인터

4분 33초 경에 질문이 있습니다.

작성

·

284

2

&arr[0][0]은 그냥 주소값이지 포인터가 아니지 않나요? 너무 헷갈립니다..ㅠ

주소값에다 정수를 더해서 너무 혼란스럽습니다... 이게 포인터면 +1을 하면 int 크기만큼 건너뛴다는건 알겠는데 저건 주소값인데 +1을 할 수 있는건가요?

답변 3

2

강진성님의 프로필 이미지
강진성
질문자

제가 말하는게 맞는지 궁금해요. 어느 정도 정리된 것 같기는 한데ㅠ

  1. arr, arr[0], &arr[0]은 모두 포인터이다.

  2. arr은 arr[0]을 가리키는 포인터이고, 포인터 타입은 int*[3]이다.

  3. arr[0]은 arr[0][0]을 가리키는 포인터인 동시에(이때 포인터 타입은 int*) 행의 배열의 원소 중 하나이다. ( 이 때 왼쪽 인덱스를 따르는 배열을 뭐라 하는지 궁금해요ㅠㅠ 행배열이라고 밖에 표현을 못하겠어서;;)

  4. &arr[0]은 arr[0]의 주소를 "명시"하는 표현이며, 이것은 int*[3]타입의 포인터이다.

 

귀찮게 해드려서 죄송합니다..ㅠㅠ

괜찮습니다.

거의 정확하게 이해하고 계신 것 같습니다!

1과 2 에 대해서 좀 더 정확하게는 arr 과 같은 배열의 이름은, 배열의 시작 주소를 가리키는 포인터와 호환이 되는 형태라는 표현이 더 정확합니다. arr 자체는 포인터가 아니라, 배열의 이름입니다. (메모리 주소를 가지고 있지 않은)
다만, arr 타입이 포인터 연산에 사용되거나, 함수에 전달될 때 int (*)[3] 타입의 포인터로 암시적 변환이 되는 것입니다.

 

3 번 질문에 대해서는 말씀하신 것 처럼 '행 배열' 로 표현하셔도 괜찮고, 혹은 2차원 arr 배열의 첫 번째 원소 배열 이라고 표현하셔도 괜찮다고 생각합니다.

 

그 외의 내용에 대해서는 모두 정확하십니다!!!

2

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

 

배열의 이름은 포인터와 호환이 되는 형태로, 포인터 연산이 가능합니다.

즉, arr 은 배열의 이름이자, 포인터 연산이 가능한 포인터로 사용될 수 있으며,
arr == arr[0] == &arr[0] == &arr[0][0] 으로, &arr[0][0] 역시 int 형 변수의 주소를 나타내는 포인터로 사용이 가능합니다.
따라서, +1 연산을 하면, int 자료형의 크기인 4 바이트 만큼 이동하여 &arr[0][1] 를 가리키게 됩니다.
배열의 이름은 포인터와 호환이 되는 형태로 사용이 가능하기 때문에 포인터 연산이 가능한 것입니다.

 

1

강진성님의 프로필 이미지
강진성
질문자

그냥 배열명이 들어가 있고 &가 붙으면 포인터가 되는 것인가요?

배열의 이름 자체는 '배열의 첫 번째 원소를 가리키는 주소' 로 해석되며, 포인터처럼 사용할 수 있는 '포인터와 호환이 되는 형태' 입니다.
이 때, 배열의 이름에 & 을 붙이면, 배열 전체의 주소를 나타내는 포인터를 반환합니다.
예를 들어, &arr[0] 은 배열의 첫 번째 원소의 주소를 가리키는 int* 타입의 포인터가 됩니다.
또한, &arrint (*)[5] 타입의 포인터가 됩니다.
즉, 배열의 이름 자체는 배열의 첫 번째 원소의 주소를 나타내며, 포인터 연산에 사용될 때 포인터처럼 동작합니다. 또한, & 는 변수나 배열의 메모리 주소를 가리키는 포인터를 반환합니다.

좀 더 자세히 답변을 드리면 다음과 같습니다.

 

  • arr
    : arr 은 배열의 이름이므로, 배열의 첫 번째 원소의 주소, 즉, arr[0] 을 가리키는 것으로 해석됩니다.
    예를 들어, int arr[2][3] 에서 arrarr[0] 의 주소를 가리키는 포인터와 호환이 되는 형태로 사용될 수 있습니다.

 

  • arr[0]
    : arr[0]arr 배열의 첫 번째 '행' 을 나타내며, 이것 자체가 또 다른 배열입니다.
    즉, int arr[2][3] 에서, arr[0]int[3] 타입의 첫 번째 행을 나타내는 배열입니다.
    이 때, arr[0] 자체는 배열을 가리키는 표현임과 동시에, 배열의 이름으로 사용될 때는 해당 배열의 첫 번째 원소의 주소(즉, arr[0][0] 의 주소)를 가리키는 포인터와 호환이 되는 형태가 됩니다.

 

  • &arr[0]
    : &arr[0] 은 첫 번째 행의 주소를 명시적으로 나타냅니다.
    이 때, &arr[0]int (*)[3] 타입으로, 3 개의 int 를 가진 배열을 가리키는 포인터 로 사용됩니다.

    즉, arr[0]&arr[0] 모두 arr 배열의 '첫 번째 행의 시작 주소' 를 가리키게 됩니다.
    (arr[0] 이 배열의 이름으로 사용될 때, 해당 배열(첫 번째 행)의 시작 주소를 의미하게 되고, &arr[0] 은 첫 번째 행 자체의 주소를 명시적으로 나타내기 때문)

강진성님의 프로필 이미지
강진성

작성한 질문수

질문하기