今天看--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语言引入了"可修改的左值"这个术语。它表示左值允许出现在赋值语句的左边。这个奇怪的术语是与数组名区分,数组名也用于确定对象在内存中的位置,也是左值,但它不能作为赋值的对象。因此,数组名是个左值但不是可以修改的左值。标准规定赋值符必须用可修改的左值作为它左边一侧的操作数。用通俗的话说,只能给可以修改的东西赋值。
本文深入探讨C语言中数组的定义、使用及限制条件。详细解释了数组的存储类型、自动初始化特性、数组名的特性以及如何正确使用数组名进行指针操作。此外,还介绍了数组在不同上下文中的表现差异及其在内存中的表示方式。
3203

被折叠的 条评论
为什么被折叠?



