查看原文
其他

数组问题:a与&a有什么不同?

正念君 嵌入式大杂烩 2021-01-31


今天分享一个关于数组的问题,这个问题在校招面试中经常会被问到。首先,看一段代码:


#include <stdio.h>

int main(void)
{
 int a[5] = {0,1,2,3,4};
 
 printf("a = %d , &a = %d \n", a, &a);
 
 return 0;


该代码运行结果为:



可见,对于一个数组:


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


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

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



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


看了这张图,想必大家已经对a与&a有了一个清晰的认识了吧。下面分析一段代码:


#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。

以上就是今天分享的关于数组的一个小知识点,希望对大家有帮助!


推 荐 阅 读

01 二维数组作为函数参数

02 小学生都在使用手机学习编程了,你还在吃鸡打王者?

03 别用Visua C++6.0来开发C程序了,用……

04 使用Notepad++来开发C程序

05 关于main()

06 一份通俗易懂的C语言内存总结

07 数组问题:a与&a有什么不同

08 C语言函数参数压栈的顺序是?

09 getchar()、getche()、getch()的区别?

10 【校招编程01】级数求和

11 【校招编程02】优雅的点

12 【校招编程03】整数翻转

13 【校招编程04】懂二进制

14 【校招编程05】找符合条件的数

15 程序员的桌面,好酷!!!


【每日一句】

为了未来美一点,现在必须苦一点。低头不算认输,放弃才是懦夫。


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存