版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
先来看一下代码
#include <stdio.h>
int main(void)
{
int a[5]={1,2,3,4,5};
int *p1=&a[0];
int *p2=a;
//int *p3=&a;//报错
int (*p3)[5]=&a;
printf("&a[0]=%X\na=%X\n&a=%X",p1,p2,p3);//以16进制输出变量内存地址
}
输出:
可以看出,不难看出,&a[0], a, &a 都表示了同一个地址,但是&a必须用一个数组指针来保存。
再来看一张对上述代码的Debug图:
首先说一下什么是数组指针?数组指针是指向数组地址的指针,其本质为指针;()优先级高,首先说明p3是一个指针,指向一个整型的一维数组,这个一维数组的长度是3,也可以说是p3的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
下面我们再执行指针变量自增1:
#include <stdio.h>
int main(void)
{
int a[5]={1,2,3,4,5};
int *p1=&a[0];
int *p2=a;
//int *p3=&a;//报错
int (*p3)[5]=&a;
printf("&a[0]=%X\na=%X\n&a=%X",p1,p2,p3);//以16进制输出变量内存地址
printf("\n******************\n");
p1++;
p2++;
p3++;
printf("&a[0]=%X\na=%X\n&a=%X(在首地址下再增加4个元素*4字节共16字节数)",p1,p2,p3);//以16进制输出变量内存地址
}
输出: