就像一维数组的名称代表a [0]的地址一样,二维数组的名称代表什么? 如果它也代表a [0] [0]的地址,那为什么 我在使用时出错:
int a[2][2];
sort(a,a+4);
而
sort(&a[0][0] , &a[0][0]+4)
工作正常。
答案 0 :(得分:3)
对于1D
这样的数组
int arr[5] = {1,2,3,4,5};
arr
表示数组名称,它表示arr
的基地址。 arr
和arr[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+0
和a+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数组)的指针。