前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C语言笔记】数组a与&a有什么不同?

【C语言笔记】数组a与&a有什么不同?

作者头像
正念君
发布2019-07-01 17:24:17
1.4K0
发布2019-07-01 17:24:17
举报
文章被收录于专栏:嵌入式大杂烩嵌入式大杂烩

首先,看一段代码:

#include <stdio.h>

int main(void)
{
 int a[5] = {0,1,2,3,4};

 printf("a = %d , &a = %d \n", a, &a);

 return 0;
}

该代码运行结果为:

V5MJSO.md.png
V5MJSO.md.png

可见,对于一个数组:

int a[5] = {0,1,2,3,4};

a与&a的值是相同的。为什么呢?

a是数组名,是一个数据区的常量,对其取地址(&a)就可以得到数组存储区域的地址,同样,a本身也代表了数组存储区的首地址。所以,a与&a的值是一样的。但是,虽然a与&a指向同一个地址,但是他们的含义是不同的。下面我们修改一下上面的代码看看”a+1”与”&a+1”是否还相等?修改后的代码运行结果为:

V5GRnU.md.png
V5GRnU.md.png

可见,a+1的值比a的值大4,即sizeof(a[0]);&a+1比&a的值大20,即sizeof(a)。由此,可得出结论:a+1指向的地址相对与a指向的地址向后偏移了sizeof(a[0])个字节,&a+1指向的地址相对与&a指向的地址向后偏移了sizeof(a)个字节,其描述图如下:

V5G5N9.md.png
V5G5N9.md.png

下面分析一段代码:

#include <stdio.h>

int main(void)
{
 int a[5] = {0,1,2,3,4};
 int *ptr = (int*)(&a+1);

 printf("*(a+1) = %d, *(ptr-1) = %d\n",*(a+1), *(ptr-1));

 return 0;
}

运行结果为:

*(a+1) = 1, *(ptr-1) = 4

*(a+1) = 1,是因为a+1代表数组第二个元素的地址,即&a[1]*(a+1)为取该地址上的值,即为1;*(ptr-1)=4,是因为ptr指向的是整个数组内存区域之后的内存,即数组最后一个元素之后的地址,ptr-1就是指向数组的最后一个元素,*(ptr-1)为取该地址上的值,即为4。

以上就是今天分享的关于数组的一个小知识点,如有错误欢迎指出!


本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-11-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档