![](https://i-blog.csdnimg.cn/blog_migrate/921c7ee93b066de593021b625e2d3a2d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8d897f1746cbe21e49389d7d4880d608.png)
![](https://i-blog.csdnimg.cn/blog_migrate/33b4698e721cbdd6ee8084b368a6c0f4.png)
可以看出它的步长是4,既在数组中是一个元素一个元素的移动,
区别:
可以来验证一下他俩的地址表示
![](https://i-blog.csdnimg.cn/blog_migrate/3d4758cbd1afe50f25e9d0afabec6f6f.png)
可以看出他俩表示的地址相同,
但是
![](https://i-blog.csdnimg.cn/blog_migrate/73ed4777fe56eb7e5ba20125a67343d1.png)
加1之后,a[0]是跳到了下一行的首地址,而a是直接跨过了整个数组,所以可以看出,在使用方面,&a[0]和a的作用相同.
总结:
“a”指向的是数组中的一行,“&a”指向的是整个数组
“a[i]”指向的是i行元素的首地址,”&a[i]”指向的是i行
在运算符顺序中:
【】的优先级比*高,
int (*p)[3];
指针数组:
int *p【3】的分配顺序就是p【3】,首先定义p为一个数组,其次它是int *类型,所以p就是一个指针类型的数组,为指针数组.
数组长度为3,每个内容都是指针类型的,
数组指针:
int (*p)【3】的分配顺序就是p,首先定义p为一个指针,其次它是【3】数组类型,所以p就是一个数组类型的指针,为数组指针.
每个指针里边都有三个元素,一共有三个这样的指针。
数组指针的赋值:
数组指针的赋值:
可以直接数组名赋值
int (*p)[3] = a; p指向数组a的第一行,a+1就指向第二行
int (*p)[3] = &a[0]; 必须要加&符号,如果不加指向的就是某个元素的地址,而数组指针要指向某一行的地址
数组指针元素的引用:
声明:p【i】代表的肯定是一个地址,但它指向的是一个数,以下说的都是指向,并不是它代表的内容,因为咱们是以二维数组举例
p【0】指向的就是a【0】,第0行
p【1】指向的就是a【1】.....
如果单个引用元素的话:
p【0】+1:指向的就是a【0】【1】(就是p[0]数组里边的第一个元素的地址)
p【0】+2:指向的就是a【0】【2】(就是p[0]数组里边的第二个元素的地址)
(二维数组其实就是特殊的一维数组,在电脑内存里存储的形式只有一维数组)
到这里之后还可以继续往后引用
p【0】+3:指向的就是a【3】的(如果超出了p[0],就去p[1]。。。。。直到最后一个元素)
。。。。。
p【0】+11:指向的就是a【11】(这里的a[11]是二维数组换成一维数组之后的内容)
就是说,前边的p【】可以引用后边的内容,但是后边的p【】不可以引用前边内容
到p【1】的话最多可以加到8
p【1】+8指向的就是a【11】
![](https://i-blog.csdnimg.cn/blog_migrate/d69101ee66b58a4cf86d40e1c3731fc3.png)
可见指向的内容也是a【11】
引用格式:
地址的引用:
*(p+i) = p【i】 指向的i行的首地址
![](https://i-blog.csdnimg.cn/blog_migrate/a4265efd85391539464a5ee4d11817be.png)
*(a+i) =a【i】
![](https://i-blog.csdnimg.cn/blog_migrate/74b8bcb4d7c7dc4bc3787649afde4bce.png)
*(p+i)+j = p【i】+j 指向的i行的后移j个位置的元素的地址(i行j列)
*(a+i)+j = a【i】+j
数组内容的引用:
*(*(p+i)+j)= *(p【i】+j) 指向的是i行后移j个位置元素,(i行j列)
*(*(a+i)+j)= *(a【i】+j)
![](https://i-blog.csdnimg.cn/blog_migrate/60ba5c836374ee4bab2c6856d3971fb1.png)