다차원 배열에 대한 포인터를 선언하는 방법은 다음과 같다.
int main(){
int arr2D[2][3] = {
{1,2,3},
{4,5,6}
};
// 2d 배열 포인터의 선언 형태
int(*2d_ptr)[3] = arr2D;
}
int main(){
int arr2D[2][3][4] =
{
{
{1,2,3},
{4,5,6},
{7,8,9},
{10,11,12}
},
{
{1,2,3},
{4,5,6},
{7,8,9},
{10,11,12}
}
}
// 3d 배열 포인터의 선언 형태
int(*3d_ptr)[3][4] = arr3D;
}
다차원 배열 type의 pointer를 만드는 것은 상당히 괴랄하게 느껴질 수 있겠지만, 다차원 배열에서 앞부분 차원을 하나 날린다고 생각하면 쉽게 외울 수 있다. 다차원 포인터로 배열 인덱스를 접근하는 방법은 배열의 이름으로 접근하는 것과 방법이 동일하다.
배열을 함수의 인자로 넘기게 되면 array-to-pointer라는 decay현상이 일어나게 된다. 따라서, 배열이 넘어가는 것이 아니라 배열 중 첫 번째 원소의 메모리 주소가 넘어가게 되는 것이다. 따라서 함수 안에서 배열의 이름으로 sizeof를 찍게 되면, 배열의 총 메모리 크기가 찍히는 것이 아닌, 배열의 포인터 크기(64bit에서는 8byte)가 찍히게 된다.
#include <iostream>
using namespace std;
int SumArray(int* arr) {
int sum = 0;
for (int i = 0; i < sizeof(arr) / 4; i++) {
sum += arr[i];
}
// 여기서 arr는 배열 포인터가 넘어왔다.
// 따라서 arr의 크기를 찍어보면 64 bit system에서는 8bit이다.
cout << "Size of an array is : " << sizeof(arr) << endl;
cout << "Size of an element of first array is : " << sizeof(arr[0]) << endl;
return sum;
}
void main() {
int arr1[6] = {1,2,3,4,5};
cout << SumArray(arr1) << endl;
cout << "Size of an array is : " << sizeof(arr1) << endl;
}