【C语言】数组名问题

目录

前言

代码展示

内容解释

情况1

情况2

情况3


前言

个人认为C语言中数组名可以分为三种情况:

  1. 所有数组名都表示首元素的地址。
  2. sizeof(数组名)-计算整个数组大小
  3. &数组名 -取整个数组的地址

代码展示

输出结果我注释在代码后面,供大家参考。(后面将做出解释)

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	//数组名表示数组首元素的地址
	printf("%p\n", &arr[0]);    //0000006D991DF5A8
	printf("%p\n", arr);        //0000006D991DF5A8

	//特例1:sizeof(数组名)--数组名表示整个数组,单位是字节
	int sz = sizeof(arr);
	printf("%d\n", sz);         //40

	//特例2:取整个数组的地址  &数组名--数组名表示整个数组
	printf("%p\n", &arr);       //0000006D991DF5A8
	printf("%p\n", &arr[0]);    //0000006D991DF5A8
	printf("%p\n", arr);        //0000006D991DF5A8

	//对比验证特例2
	printf("%p\n", &arr);       //0000006D991DF5A8
	printf("%p\n", &arr+1);     //0000006D991DF5D0
	printf("%p\n", arr);        //0000006D991DF5A8
	printf("%p\n", arr+1);      //0000006D991DF5AC
	printf("%p\n", &arr[0]);    //0000006D991DF5A8
	printf("%p\n", &arr[1]);    //0000006D991DF5AC
	return 0;
}

内容解释

情况1

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	//数组名表示数组首元素的地址
	printf("%p\n", &arr[0]);    //0000006D991DF5A8
	printf("%p\n", arr);        //0000006D991DF5A8

	return 0;
}

第6行代码,我们输出数组arr的首元素地址

第7行代码,我们输出数组名arr 

可以看到二者输出结果均为0000006D991DF5A8,则证明数组名表示数组首元素的地址。 

情况2

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	
	//特例1:sizeof(数组名)--数组名表示整个数组,单位是字节
	int sz = sizeof(arr);
	printf("%d\n", sz);         //40

	return 0;
}
sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数
组;而不是数组首字母地址。

情况3

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };

	//特例2:取整个数组的地址  &数组名--数组名表示整个数组
	printf("%p\n", &arr);       //0000006D991DF5A8
	printf("%p\n", &arr[0]);    //0000006D991DF5A8
	printf("%p\n", arr);        //0000006D991DF5A8

	//对比验证特例2
	printf("%p\n", &arr);       //0000006D991DF5A8
	printf("%p\n", &arr+1);     //0000006D991DF5D0
	printf("%p\n", arr);        //0000006D991DF5A8
	printf("%p\n", arr+1);      //0000006D991DF5AC
	printf("%p\n", &arr[0]);    //0000006D991DF5A8
	printf("%p\n", &arr[1]);    //0000006D991DF5AC
	return 0;
}

 &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。

这里我们可以发现第7、8、9行代码,输出结果均为0000006D991DF5A8,但是他们表达的意义不同。第7行 &数组名,取出的是整个数组的地址(可以理解为一个小区的一栋单元楼,第一层住户的地址即可代表整栋单元楼----假设一楼一户);第8,9行则是指出数组中首元素的地址(一栋单元楼中一层住户个体地址

下面我们进行对比验证

12行、13行相差28(十六进制,即十进制40

14行、15行相差1

16行、17行相差1

由此我们可以得出,&数组名+1 得到下一个数组地址(下一栋单元楼);而 数组名+1 与 首元素+1 得到的是数组中下一个元素(本单元楼的二楼住户)。


内容若有错误,请大家在评论区指出!谢谢阅读!

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

榨不干

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值