1: 数组名为地址, 表达方法:
- Int A[10];
- A;
- &A;
- &A[0];
数组名是指针常量
2: 指针数组 (每个元素都是指针
指针数组: double *a[10];
每个元素占 4/8 个字节;
3: 数组指针:.int (*p2)[5];
指向数组的指针, 在多维数组使用
p2 指向 5 个 int 的数组
p2+1: 地址增加 5 个 int 变量的长度
指向二维数组的每行首地址.
注:(*p) 的括号不可省略,[ ] 的优先级高于 *, 若不加括号就是指针数组了.
初始化办法: int a[2][3];
int (*p)[3] = a;
a 将首地址给过去, 3 定义偏移量
- a[i][j] // 直接访问
- ==*(*(a+i)+j) // 取内容符, 通过数组名访问
- ==p[i][j]
- ==*(*(p+i)+j) // 通过数组指针访问
a 二维数组
*(a+i) 等价于 a[i] // 直接访问成员
a[i] 表示第 i 行的所有数据 , 数据长度为 3*4=12byte
*(a+i)+j 表示第 i 行第 j 个元素的地址
*(*(a+i)+j) 取内容访问该元素
博客:
*(a+1) 单独使用时表示的是第 1 行数据, 放在表达式中会被转换为第 1 行数据的首地址 (有第 0 行)
编译器遇到这种情况都会转换为指向该行第 0 个元素的指针
*(*(a+1)+1) 表示第 1 行第 1 个元素的值. 很明显, 增加一个 * 表示取地址上的数据.
原书:
因为;
*(a+i) 等价于 a[i] // 取内容符:
二维数组的内容是一维数组
一维数组的名字是行的首地址
所以
*(*(a+i)+j) 等价于 *(a[i]+j) //
a[i] 是第 i 行首地址
*(a[i]+j) 等价于 (a[i])[j]
在取内容符中 j 对应一维数组
偏移量 j 个 int
来源: http://www.bubuko.com/infodetail-3395378.html