数组名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之间的关系的主要内容,如果未能解决你的问题,请参考以下文章

javascript常用代码片段

C中数组与指针转

C-指针数组与数组指针

数组名的地址,和数组名取地址的讨论

数据分析&数据挖掘文件的读取与保存

数组排序代码,冒泡排序&快速排序&选择排序