数组名arr与&arr之间的关系
Posted 两颗苹果
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组名arr与&arr之间的关系相关的知识,希望对你有一定的参考价值。
在学习c语言中指针部分的时候,往往会有一个困惑,数组名arr和&arr有神马不同?甚至在求一些比较复杂的sizeof时不知道表示的是甚么意思?怎么求的......着实让人头疼(本人也被这个折磨过一段时间,所以深有体会,希望后面来的小伙伴们能够轻松掌握这个小技巧,不走弯路,不被折磨哦!)
1.什么是arr?
其实arr简单点上来讲只是一个数组的名字,比如他叫张三,那个人李四一样,没什么特别含义,比如:
int arr[5] = { 1, 2, 3, 4, 5 };
那我也可以这么叫他:
int a[5] = { 1, 2, 3, 4, 5 };
这都不影响,但是透过表面运用到代码里面他的意思就有不同了。
2.arr和&arr
我们说两种特殊情况
第一,当我们运用单目操作符 sizeof 去计算这个数组所占据的内存大小时,arr表示整个数组!!!
第二,&arr表示整个数组的地址。
其余的情况代表首元素地址!!!
下面我用实例来进行说明:下面是我的完整代码。
#include<stdio.h>
#include<windows.h>
#pragma warning(disable:4996)
int main()
{
int arr[5] = { 1, 2, 3, 4, 5 };
int a[5] = { 1, 2, 3, 4, 5 };
printf("这是int arr[5]\\n");
printf("arr -> %d\\n", sizeof(arr));
printf("arr -> %d\\n", arr);
printf("&arr -> %d\\n", &arr);
printf("arr+1 -> %d\\n", arr + 1);
printf("&arr+1 -> %d\\n", &arr + 1);
printf("********************************\\n");
printf("这是int a[5]\\n");
printf("a -> %d\\n", sizeof(a));
printf("a -> %d\\n", a);
printf("&a -> %d\\n", &a);
printf("a+1 -> %d\\n", a + 1);
printf("&a+1 -> %d\\n", &a + 1);
system("pause");
return 0;
}
运行结果:
(首先说明我上面所说的数组名是arr还是a,表面意思是一样的,只是一个名字而已,其他的部分我都以arr为例子,所以,兄弟萌不要慌,只要看懂一个其余不就拿捏了吗)
我们接下来要关注的是重点:
(1)我们都知道 int 类型占4个字节,通过sizeof我们求到的大小是4*5=20
(2)为什么 arr -> 15727788 &arr -> 15727788一样呢?
上面认真看的小伙伴就知道了,arr单独拿出来表示的是首元素的地址,而&arr是整个数组的地址,虽然表示相同,但是含义却差之千里哦!!!没懂的小伙伴也不要急,后面还有解释。
(3)通过(2)我们知道,arr表示首元素地址,那么arr+1就表示第二个元素的地址,所以在首元素地址的基础上加4个字节就是 arr+1 -> 15727792
(4)第二个不懂得小伙伴,看过来啦!
我们说&arr表示整个数组的地址,那么 &arr+1表示什么呢?其实就是整个数组之后的那个字节呗,按计算来说,一共20个字节,首元素地址是&arr -> 15727788 ,我们给他加上20个字节就是&arr+1 -> 15727808 与实际得到的地址完全一致,说明&arr就表示的是整个数组的地址了。
这也就印证了,我们所说的arr和&arr表示相同的原因了
以上就是arr和&arr之间的联系啦,希望看懂的小伙伴,三连支持一下啦。
以上是关于数组名arr与&arr之间的关系的主要内容,如果未能解决你的问题,请参考以下文章