C中数组浅析(一)

本文深入探讨C语言中数组的定义、使用及限制条件。详细解释了数组的存储类型、自动初始化特性、数组名的特性以及如何正确使用数组名进行指针操作。此外,还介绍了数组在不同上下文中的表现差异及其在内存中的表示方式。

今天看--C缺陷与陷阱 的一些收获.

 

数组定义的语法

存储类型 数据类型 数组名[数组长度]

存储类型还是那四个。

extern 和static 数组元素自动初始化为0;

自动数组(auto)中的元素需要分别初始化!!

不允许这样定义:  int a[] ; //不允许这样定义

*******************************************************************************************

对于一个数组只能做两件事

1) 确定该数组的大小。---sizeof(数组名)

      int a[3]声明a是一个数组,有3个整型元素。因此sizeof(a)是 3和sizeof(int)的乘积。

       如果a是用于sizeof操作数,而是用于其它场合,则a总是被转换成指向 a数组的起始元素的指针。

 

:2010年10月9号添加

除了a 被用作运算符sizeof的参数这一情形,在其他所有的情形中数组名 a都代表指向数组a 中下标为0 的元素的指针。正如我们

合乎情理的期待,sizeof(a) 结果是整个数组 a的大小,而不是指向数组a 的元素的指针的大小!

      2)获得指向该数组下标为0的元素的指针

其它有关数组的操作,哪怕它们乍看上去是以数组下标进行运算的,实际上都是通过指针进行的。换句话说,任何一个数组下标运算都等同于一个对应的指针运算,因此我们完全可以依据指针行为定义数组下标的行为。

 

***************************************************************************************************************************

C语言中只有一维数组,而且数组的大小必须在编译期间就作为一个常数确定下来。

然而,C语言中数组的元素可以是任何类型的对象,当然也可以是另外一个数组。这样,要“仿真”出一个多维数组就不是一件难事!

 

***************************************************************************************************************************

int *p;

p = &a 在ANSI C中式非法的。

因为: &a是一个指向数组的指针

p是一个指向整型变量的指针。

在早期版本的C语言实现中,并没有所谓的“数组地址”的概念,因此&a或者被视为非法,或者就等于a!!

 

***************************************************************************************************************************

数组名作为左值是不可以被赋值的!

 

左值:在编译时可知,左值表示存储结果的地方;

右值:直到运行时才知。

 

C语言引入了"可修改的左值"这个术语。它表示左值允许出现在赋值语句的左边。这个奇怪的术语是与数组名区分,数组名也用于确定对象在内存中的位置,也是左值,但它不能作为赋值的对象。因此,数组名是个左值但不是可以修改的左值。标准规定赋值符必须用可修改的左值作为它左边一侧的操作数。用通俗的话说,只能给可以修改的东西赋值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值