C语言笔记:假设有一个数组a[5],则&a[0]与a与&a的区别

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_42124234/article/details/101075554

先来看一下代码

#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进制输出变量内存地址
} 

输出:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42124234/article/details/101075554