C++ 2D数组的确切名称代表什么?
就像一维数组的名称表示[0]的地址一样,二维数组的名称表示什么? 如果它还表示[0][0]的地址,那么为什么 我使用以下命令时出错:C++ 2D数组的确切名称代表什么?,c++,arrays,multidimensional-array,C++,Arrays,Multidimensional Array,就像一维数组的名称表示[0]的地址一样,二维数组的名称表示什么? 如果它还表示[0][0]的地址,那么为什么 我使用以下命令时出错: int a[2][2]; sort(a,a+4); 而 sort(&a[0][0] , &a[0][0]+4) 工作非常好。二维数组是数组的数组,其工作方式与一维数组完全相同: int a[10]; a == &a[0]; int* = &a[0]; int b[10][20]; b == &b[0]; int** =
int a[2][2];
sort(a,a+4);
而
sort(&a[0][0] , &a[0][0]+4)
工作非常好。二维数组是数组的数组,其工作方式与一维数组完全相同:
int a[10];
a == &a[0];
int* = &a[0];
int b[10][20];
b == &b[0];
int** = &b[0];
2D数组的名称相当于指向外部数组的第一个元素(内部1D数组)的指针。2D数组是数组的数组,其工作方式与1D数组完全相同:
int a[10];
a == &a[0];
int* = &a[0];
int b[10][20];
b == &b[0];
int** = &b[0];
2D数组的名称相当于指向外部数组的第一个元素(内部1D数组)的指针。对于
1D
类数组
int arr[5] = {1,2,3,4,5};
int arr[2][2] = { {1,2},{3,4}};
arr
表示数组名,它表示arr
的基址。并且arr
和arr[0]
的地址相同
类似于2D
array-like
int arr[5] = {1,2,3,4,5};
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]a[0][1]a[1][0]a[1][1]
|(0x100)|(0x104)|(0x108)|(0x10c)
------------- ------------
| |
a[0](0x100)a[1](0x108)或a+1。。。没有a+4
| |
----------------------
|
a(0x100在1D
类似数组的情况下
int arr[5] = {1,2,3,4,5};
int arr[2][2] = { {1,2},{3,4}};
arr
表示数组名,表示arr
的基址,arr
和arr[0]
的地址相同
类似于2D
array-like
int arr[5] = {1,2,3,4,5};
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]a[0][1]a[1][0]a[1][1]
|(0x100)|(0x104)|(0x108)|(0x10c)
------------- ------------
| |
a[0](0x100)a[1](0x108)或a+1…没有a+4
| |
----------------------
|
a(0x100A)指向第一个元素的指针(衰减后)你能发布错误吗?a+4
远远超出范围,你是说a+2
作为指向末尾的指针吗?二维数组只是1D数组中的1D数组。它们的行为与任何其他1D数组完全相同:a=&a[0]
(注意&a[0]
的类型是int(*)[2] 排序(a,a+4)编译的原因是数组即使有多个维度也会衰减到它的第一个元素的地址。因此a
变成&a[0][0]
。但a+4
就不是这样了,因为这与a[4]
和a[4]
一样,然后衰减到&a[4][0]
或&a[0][0]+8
,这应该清楚地说明它为什么不工作。指向第一个元素的指针(衰减后)你能发布错误吗?a+4
远远超出了范围,你是说a+2
作为指向结尾的指针吗?2D数组只是1D数组中的1D数组。它们的行为与任何其他1D数组完全相同:a==&a[0]
(请注意,&a[0]
的类型是int(*)[2]
。在这种情况下,排序的原因是(a,a+4)编译的根本原因是数组即使有多个维度也会衰减到它的第一个元素的地址。因此a
变成&a[0][0]
。但是a+4
就不是这样了,因为这与a[4]
和a[4][code>一样,然后衰减到&a[4][0]
或&a[0][0]+8
,这应该清楚地说明它为什么不起作用。