C++ 2D数组的确切名称代表什么?

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** =

就像一维数组的名称表示[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** = &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
,这应该清楚地说明它为什么不起作用。