작성
·
284
2
&arr[0][0]은 그냥 주소값이지 포인터가 아니지 않나요? 너무 헷갈립니다..ㅠ
주소값에다 정수를 더해서 너무 혼란스럽습니다... 이게 포인터면 +1을 하면 int 크기만큼 건너뛴다는건 알겠는데 저건 주소값인데 +1을 할 수 있는건가요?
답변 3
2
제가 말하는게 맞는지 궁금해요. 어느 정도 정리된 것 같기는 한데ㅠ
arr, arr[0], &arr[0]은 모두 포인터이다.
arr은 arr[0]을 가리키는 포인터이고, 포인터 타입은 int*[3]이다.
arr[0]은 arr[0][0]을 가리키는 포인터인 동시에(이때 포인터 타입은 int*) 행의 배열의 원소 중 하나이다. ( 이 때 왼쪽 인덱스를 따르는 배열을 뭐라 하는지 궁금해요ㅠㅠ 행배열이라고 밖에 표현을 못하겠어서;;)
&arr[0]은 arr[0]의 주소를 "명시"하는 표현이며, 이것은 int*[3]타입의 포인터이다.
귀찮게 해드려서 죄송합니다..ㅠㅠ
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*
타입의 포인터가 됩니다.
또한, &arr
은 int (*)[5]
타입의 포인터가 됩니다.
즉, 배열의 이름 자체는 배열의 첫 번째 원소의 주소를 나타내며, 포인터 연산에 사용될 때 포인터처럼 동작합니다. 또한, &
는 변수나 배열의 메모리 주소를 가리키는 포인터를 반환합니다.
좀 더 자세히 답변을 드리면 다음과 같습니다.
arr
: arr
은 배열의 이름이므로, 배열의 첫 번째 원소의 주소, 즉, arr[0]
을 가리키는 것으로 해석됩니다.
예를 들어, int arr[2][3]
에서 arr
은 arr[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]
은 첫 번째 행 자체의 주소를 명시적으로 나타내기 때문)
괜찮습니다.
거의 정확하게 이해하고 계신 것 같습니다!
1과 2 에 대해서 좀 더 정확하게는
arr
과 같은 배열의 이름은, 배열의 시작 주소를 가리키는 포인터와 호환이 되는 형태라는 표현이 더 정확합니다.arr
자체는 포인터가 아니라, 배열의 이름입니다. (메모리 주소를 가지고 있지 않은)다만,
arr
타입이 포인터 연산에 사용되거나, 함수에 전달될 때int (*)[3]
타입의 포인터로 암시적 변환이 되는 것입니다.3 번 질문에 대해서는 말씀하신 것 처럼 '행 배열' 로 표현하셔도 괜찮고, 혹은 2차원
arr
배열의 첫 번째 원소 배열 이라고 표현하셔도 괜찮다고 생각합니다.그 외의 내용에 대해서는 모두 정확하십니다!!!