二维数组的指针
其实本质就是把二维数组本质上是一维数组的一维数组和一维数组的指针特性组合而成,没有新的东西。
对数组符号的二次阐明
使用int a[3][4];进行说明。
这个a代表什么?
a代表一个二维数组的数组对象。这里这个对象是C++里的一个广泛定义,指代一片内存空间。这个对象的具体定义不展开,可能会和面向对象的类的实例发生混淆。需要知道,数组对象不是类的实例。类的实例和数组对象同属于C++的对象定义之下。
所以,a不是指针!就是代表这12个int的整体,这整个数组。因此这解释了在sizeof(a)的时候,得出的不是指针的大小8,而是整个数组占据的空间(应当是48).
那么,指针是怎么回事? 这是因为数组对象会发生“退化”现象。在表达式中运用的时候,数组名将会退化为指向首元素的指针。而这,就运用到数组的本质,n维数组是由n-1维数组对象作为元素的一维数组。a的首元素是a[0],不是a[0][0]。在发生退化的情况下,a才被转换成了一个指针,指针的基类型是a[0]的类型,a[0]是一个一维数组,是int [4]。此时a可被看作int (*)[4]。
对类型声明描述的二次阐明
在定义变量的时候,我们会加上各种符号对新变量进行说明。这些声明符和表达式里的运算符一样,是有优先级的。
| 优先级 | 声明符 | 说明 |
|---|---|---|
| 1 | () | 改变结合顺序 |
| 2 | []() | 跟在新标识符后,一个是数组一个是函数 |
| 3 | * & | 前缀,从右向左读 |
int a[3];首先遇到[3],识别为一个大小为3的一维数组;然后遇到int,决定前面这个数组的元素类型。最终为大小为3的一维数组,元素类型为int。int a[3][4];首先遇到[3],识别为一个大小为3的一维数组;然后遇到[4],决定前面这个数组的元素类型,识别为一个大小为4的一维数组;然后遇到int,决定前面这个数组的元素类型。也就是a是一个大小为3的数组,数组的元素每个都是大小为4的数组,数组的元素每个都是int。int (&b)[3];首先遇到&,识别为一个引用;然后遇到[3],决定了前面引用的类型,识别为一个大小为3的一维数组;然后遇到int,决定前面这个数组的元素类型。也就是b是一个针对大小为3的int一维数组的引用。int *&b;首先遇到&,识别为一个引用;然后遇到*,决定了前面引用的类型,识别为一个指针;然后遇到int,决定前面这个指针的基类型。也就是b是一个针对基类型为int的指针的引用。int (*a)[4];首先遇到*,识别为一个指针;然后遇到[4],决定了前面指针的基类型,识别为一个大小为4的一维数组;然后遇到int,决定前面这个数组的元素类型。也就是a是一个指向一个大小为4的int一维数组的指针。int *f()首先遇到(),识别为一个函数;然后遇到*,决定了前面函数返回值的类型,识别为一个指针;然后遇到int,决定前面这个指针的基类型。也就是f是一个返回值为指向int的指针的函数。
写法究极大全
前置定义:
int a[3][4];x = a[i]
| 表达式 | 意义 | 具体是 |
|---|---|---|
a | int [3][4]类型,二维数组数组对象,可退化为int (*)[4]类型,即指向一个大小为4的int一维数组的指针。 | 退化后具体指向了a[0]一维数组。 |
a[i]/x | int [4]类型,一维数组数组对象,可退化为int *类型,即指向一个int的指针。 | 退化后具体指向了a[i][0]int变量。 |
a[i][j] | int类型,一个int变量。 | 不能再具体了 |
&a | int (*)[3][4]类型,指向一个二维数组数组对象的指针。 | 具体指向了a这个二维数组。 |
&a[i] | int (*)[4]类型,指向一个一维数组数组对象的指针。 | 具体指向了a[i]这个一维数组。 |
a+i | int (*)[4]类型,指向一个一维数组数组对象的指针。 | 具体指向了a[i]这个一维数组。 |
*(a+i) | int [4]类型,一维数组数组对象。可退化为int *类型,即指向一个int的指针。 | 具体等价于a[i]。退化后具体指向了a[i][0]int变量。 |
&a[i][j] | int *类型,指向一个int的指针。 | 具体指向了a[i][j]int变量。 |
x[j] | 同a[i][j] | 同a[i][j] |
&x[j] | 同&a[i][j] | 同&a[i][j] |
x+j | int *类型,指向一个int的指针。 | 具体指向了a[i][j]int变量。 |
*(x+j) | int类型,一个int变量。 | 具体等价于a[i][j]。 |
a[i]+j | 同x+j | 同x+j |
*(a[i]+j) | 同*(x+j) | 同*(x+j) |
*(a+i)+j | int *类型,指向一个int的指针。 | 具体指向了a[i][j]int变量。 |
*(*(a+i)+j) | int类型,一个int变量。 | 具体等价于a[i][j]。 |
- 本文链接: https://alsbb.top/posts/oop/oop1/
- 版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 许可协议。
