25、数组的本质

1、数组的概念

定义:数组是相同类型变量的有序集合
在这里插入图片描述

老师语录:数组只有遇到sizeof 和&两种情况才不会退化,否则均退化为指向首元素的指针。
所以,比如写个程序

#include <stdio.h>

int main()
{
	int a[5] = { 0 };
	printf("sizeof(a) = %d\n", sizeof(a));		提出问题:a是指数组首元素地址还是数组名?

	return 0;
}

在这里插入图片描述
根据我上面的老师语录,推出数组名遇到sizeof、&就只表示整个数组,其余都表示数组首元素的地址。

2、数组地址与数组名

  • 数组名 代表数组首元素地址
  • 数组的地址 需要&才能得到
  • 数组首元素的地址与数组的地址值相同
  • 数组首元素的地址与数组的地址是两个不同的概念
#include <stdio.h>

int main()
{
	int a[5] = { 0 };
	printf("a = %p\n", a);			 //数组首元素的地址
	printf("&a = %p\n", &a); 		 //整个数组的地址
	printf("&a[0] = %p\n", &a[0]);	 //数组首元素的地址

	return 0;
}

在这里插入图片描述
第 6 条语句和第 8 条语句其实是一个意思。

3、数组名的盲点

  • 数组名可以看做一个指针常量
  • 数组名指向的是内存中数组首元素的起始位置
  • 数组名不包括数组的长度信息
  • 在表达式中数组名只能作为右值使用
#include <stdio.h>

int main()
{
	int a[5] = { 0 };
	int b[2];
	int* p = NULL;
	p = a;				//作为右值使用

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

	printf("\n");
	p = b;
	printf("b = %p\n", b);
	printf("p = %p\n", p);
	printf("&p = %p\n", &p);
	printf("sizeof(b) = %d\n", sizeof(b));
	printf("sizeof(p) = %d\n", sizeof(p));
 // b = a;
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值