数组名和指针的区别

打印 上一主题 下一主题

主题 906|帖子 906|积分 2718

一、数组名代表什么
二、数组名同指针区别
三、使用数组名的其它含义
一、数组名代表什么
考虑如下声明:
  1. int a;
  2. 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的常量 指针”;
如果数组名的类型是其他类型,那么数组名的类型就是“指向其他类型的常量指针”
那么数组名的值是一个指针常量,那么数组指针岂不是相同的?
很显然,并不是,因为数组具有一些和指针完全不同的特征。例如:数组具有确定数量
的元素,而指针只是一个标量值。编译器用数组名来记住这些属性。只有当数组名在表达
式中使用时,编译器才会为其产生一个指针常量。
二、数组名同指针区别
为了说明指针和数组并不是相等的,考虑如下声明:
  1. int a[5];
  2. int *b;
复制代码
a和b能够互换使用吗?他们都具有指针价值,而且都可以进行间接访问和下标引用访问操
作。但是,他们还是存在相当大的区别。
声明一个数组时,编译器将根据声明所指定的元素保留内存空间,然后再创建数组名,它
的值是一个常量,指向这段空间的起始位置(首元素的地址)。
声明一个指针时,编译器只为指针本身保留内存空间,它并不为任何整型值分配内存空间。
此外,指针变量并未被初始化为指向任何现有的内存空间,如果它不是一个自动变量,它甚至
根本不会被初始化。把这两个声明用图的方法来表示,可以发现它们之间存在显著不同。

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

科技颠覆者

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表