2D阵列的确切名称代表什么?

时间:2018-06-28 10:36:54

标签: c++ arrays multidimensional-array

就像一维数组的名称代表a [0]的地址一样,二维数组的名称代表什么? 如果它也代表a [0] [0]的地址,那为什么 我在使用时出错:

int a[2][2];
sort(a,a+4);

sort(&a[0][0] , &a[0][0]+4)

工作正常。

2 个答案:

答案 0 :(得分:3)

对于1D这样的数组

int arr[5] = {1,2,3,4,5};

arr表示数组名称,它表示arr的基地址。 arrarr[0]的地址是相同的。

类似2D数组的情况

int arr[2][2] = { {1,2},{3,4}};

arr表示数组名,它表示arr的基地址。

printf("%p\n",(void*)arr);
printf("%p\n",(void*)&arr[0]);
printf("%p\n",(void*)&arr[0][0]);

所有printf()上的结果都相同。

注意::在以下情况下

int a[2][2];
sort(a,a+4);

a+4根本不存在,您只有a+0a+1

a[0][0]     a[0][1]     a[1][0]     a[1][1]
  |(0x100)    |(0x104)   |(0x108)     |(0x10c)
  -------------           ------------    
        |                    |
       a[0](0x100)          a[1](0x108) or a+1 ... there is no a+4
        |                    |
        ----------------------   
                 |
                 a (0x100<- assume base address of 2D array a is ox100)

虽然&a[0][0]+4不同,但是(0x100 + 4 * sizeof(a[0][0])0x110(in hexa)

答案 1 :(得分:0)

2D数组是数组的数组,其工作方式与1D数组完全相同:

int a[10];
a == &a[0];
int* = &a[0];

int b[10][20];
b == &b[0];
int** = &b[0];

2D数组的名称等效于指向外部数组的第一个元素(即内部1D数组)的指针。