1.数组指针
数组在内存占有一片连续的储存空间,这个连续空间的首地址为数组的指针
2.一维数组指针
int a[4],*p; 定义整数型一维数组,及整数型指针
p=&a[0]; p=a; 将数组a[4]的首地址赋值给p
a[0] 或 *p |
a[1] 或 *(p+1) |
a[2] 或*(p+2) |
a[3] 或*(p+3) |
a为a[4]的数组名,默认为a[4]的首地址,将a赋值为相同变量的指针p,指针p就是指针指向数组a的指针,即把a的功能给p使用
指针的更深刻的理解
3 |
5 |
7 |
9 |
a[0]=3,a[1]=5,a[2]=7,a[3]=9
a[0]的地址为200,a[1]的地址为201,a[2]的地址为202,a[3]的地址为203
指针p=200,*p(解引用p)=a[0]=3
*(p+1)是指将指针p的地址200加1
*p+1是指将a[0]的值3加1,即为4
3.二维数组指针
二维数组的结构以及在内存中的形式
书面上体现的二维数组:
a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0] a[1][1] a[1][2] a[1][3]
a[2][0] a[2][1] a[2][2] a[2]3]
a[3][0] a[3][1] a[3][2] a[3][3]
内存中二维数组的存放形式:
a[0][0] a[0][1] a[0][2] a[0][3] | 200 201 202 203 |
a[1][0] a[1][1] a[1][2] a[1][3] | 204 205 206 207 |
a[2][0] a[2][1] a[2][2] a[2][3] | 208 209 210 211 |
a[3][0] a[3][1] a[3][2] a[3][3] | 212 213 214 215 |
二维数组可理解为包含4个元素的一维数组:a[0] a[1] a[2] a[3]
int a[4][4],*p;
*p=&a; 或 p=a;
根据数组名默认为数组的地址,即可知:
从一维数组的角度:(行地址)
a表示第0行的首地址 与&a[0][0] 、
a+1表示第1行的首地址 与&a[1][0]
a+i 表示第i行的首地址 与&a[i][0]
从二维数组的角度:(元素地址)
a[0]+1:表示一维数组中第二个元素的地址,相当于&a[0][1]
a[0]+2:表示一维数组中第三个元素的地址,相当于&a[0][2]
a[1]+1:表示二维数组中第二个元素的地址,相当于&a[1][1]
相关例子
*(a[1]+1) *(*(a+1)+1)表示a[1][1]的值
分析:a[1]为a[1][]的数组名,即为其首地址,指向a[1][0]
a[1]+1指向a[1][1]
对a[1]+1进解引用,即*(a[1]+1) 为a[1][1]的值
a为数组a的首地址,为行地址,即a[0][0]的值
a+1指向a[1][0],+1指的是行地址加1,实际上加的是数组a[0][i]的数量,即加i
*(a+1)为a[1][0]的值,又为a[1][]的首地址
*(a+1)+1就是直接地址加1,指向a[1][1]
再进行解引用,即*(*(a+1)+1)为a[1][1]的值