数组名和指针的区别

一、数组名代表什么
二、数组名同指针区别
三、使用数组名的其它含义

一、数组名代表什么
考虑如下声明:

int a;
int b[10];

我们将变量a成为标量,因为它是一个单一的值,而这个变量的类型为一个整型(int),
而变量b我们称为一个数组,因为它是一些值的集合。下标和数组名一起使用,可用于标
识该集合中某个特定的值。

如b[0]表示的是数组b的第一个元素的值,b[4]表示第5个值,每个特定值都是一个量。
b[4]的类型是整型,那b的类型是什么?以及b 表示的又是什么?

既然b[0],b[1],b[2],b[3],b[4]代表的是单个的元素,那么b代表的不就整个数组吗?
但事实并非如此,在C中,几乎所有使用数组名的表达式中,数组名的值是一个指
针常量,也就是数组名是一个指向数组第一个元素的地址的指针常量

并取决于数组元素的类型:如果为int类型,那么数组名的类型就是“指向int的常量 指针”;
如果数组名的类型是其他类型,那么数组名的类型就是“指向其他类型的常量指针”

那么数组名的值是一个指针常量,那么数组指针岂不是相同的?

很显然,并不是,因为数组具有一些和指针完全不同的特征。例如:数组具有确定数量
的元素,而指针只是一个标量值。编译器用数组名来记住这些属性。只有当数组名在表达
式中使用时,编译器才会为其产生一个指针常量。

二、数组名同指针区别

为了说明指针和数组并不是相等的,考虑如下声明:

int a[5];
int *b;

a和b能够互换使用吗?他们都具有指针价值,而且都可以进行间接访问和下标引用访问操
作。但是,他们还是存在相当大的区别。

声明一个数组时,编译器将根据声明所指定的元素保留内存空间,然后再创建数组名,它
的值是一个常量,指向这段空间的起始位置(首元素的地址)。

声明一个指针时,编译器只为指针本身保留内存空间,它并不为任何整型值分配内存空间。
此外,指针变量并未被初始化为指向任何现有的内存空间,如果它不是一个自动变量,它甚至
根本不会被初始化。把这两个声明用图的方法来表示,可以发现它们之间存在显著不同。

ps:此时的b为野指针

三、使用数组名的其它含义

数组名在一般情况下使用时都是代表首元素地址,但在以下两种情况是其他含义:
1.&(数组名),该情况是产生一个指向数组的指针。
2.sizeof(数组名),该情况返回整个数组的长度。

posted @ 2023-02-28 21:42  燥zao  阅读(401)  评论(0编辑  收藏  举报