在《c程序设计语言》一书中看到一句话一直不太明白,说外部变量和静态变量的初始化表达式必须是常量表达式,可是在之后的章节中又看到这样的代码
#define ALLOCSIZE 10000
static char allocbuf[ALLOCSIZE];
static char *allcop = allocbuf;
求教这里面的allcop指针变量的初始化表达式为什么可以用?是因为数组名其实不是一个真正的变量吗?那数组名到底算什么呢?就是一个代表数组第一个元素的地址常量吗?再将数组改为一个指针变量以后也确实编译失败了,请问数组名到底是个什么存在呢?常量?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
数组是数组,指针是指针,二者是两回事。数组名在某些情况下可以隐式转换(或称作退化)为指向数组首个元素的指针。
例如,定义一个数组:
int a[10];
则数组a包含10个保存int类型变量的内存空间。你可以把任意一个int类型的变量赋值给a中的任一元素
a[4] = 2; a[0] = 8;
而定义一个指针:
int *p;
则指针p包含1个保存int类型变量的地址的内存空间,不能直接保存int类型变量。你可以把任意一个int类型的变量的地址赋值给p
p = &a[4]; p = &a[0];
这两个例子很好理解,我们把数组a中下标为4或0的元素的地址赋值给了指针p。再看一个例子
p = a; // (1) 正确
p = &a; // (2) 错误
在语句(1)中,当我们直接使用数组名a来进行赋值的时候,数组名到指针的隐式转换(退化)发生了,此时数组名a退化成了这个数组的首个元素的地址(即&a[0]),它的类型退化成了int *。所以语句(1)的效果与上一个例子中的p = &a[0];相同。
在语句(2)中,&a并不会发生数组名到指针的隐式转换(退化),它返回的类型实际上是int ()[10],并不会自动退化成int ,所以语句(2)的赋值是错误的。
另一个不会发生数组名到指针的隐式转换(退化)的例子是sizeof。
•sizeof(a)表示数组a的大小,即10 * sizeof(int)。
•sizeof(a[0])或sizeof(a)表示数组a中一个元素的大小,即sizeof(int)。(注意在sizeof(a)中发生了数组名到指针的退化。)