可以把另外一个地址赋给一个数组名吗?
不可以,尽管在一个很常见的特例中好象可以这样做。
数组名不能被放在赋值运算符的左边(它不是一个左值,更不是一个可修改的左值)。一个数组是一个对象,而它的数组名就是指向这个对象的第一个元素的指针。
如果一个数组是用extern或static说明-的,则它的数组名是在连接时可知的一个常量,你不能修改这样一个数组名的值,就象你不能修改7的值一样。
给数组名赋值是毫无根据的。一个指针的含义是“这里有一个元素,它的前后可能还有其它元素”,一个数组名的含义是“这里是一个数组中的第一个元素,它的前面没有数组元素,并且只有通过数组下标才能引用它后面的数组元素”。因此,如果需要使用指针,就应该使用指针。
有一个很常见的特例,在这个特例中,好象可以修改一个数组名的值:
void f(chara[12])
{
++a; /*legal!*/
}
秘密在于函数的数组参数并不是真正的数组,而是实实在在的指针,因此,上例和下例是等价的:
void f(char *a)
{
++a; /*certainlylegal*/
}
如果你希望上述函数中的数组名不能被修改,你可以将上述函数写成下面这样,但为此你必须使用指针句法:
void{(char *const a)
{
++a; /*illegal*/
}
在上例中,参数a是一个左值,但它前面的const关键字说明了它是不能被修改的。
数组名不能被放在赋值运算符的左边(它不是一个左值,更不是一个可修改的左值)。一个数组是一个对象,而它的数组名就是指向这个对象的第一个元素的指针。
如果一个数组是用extern或static说明-的,则它的数组名是在连接时可知的一个常量,你不能修改这样一个数组名的值,就象你不能修改7的值一样。
给数组名赋值是毫无根据的。一个指针的含义是“这里有一个元素,它的前后可能还有其它元素”,一个数组名的含义是“这里是一个数组中的第一个元素,它的前面没有数组元素,并且只有通过数组下标才能引用它后面的数组元素”。因此,如果需要使用指针,就应该使用指针。
有一个很常见的特例,在这个特例中,好象可以修改一个数组名的值:
void f(chara[12])
{
++a; /*legal!*/
}
秘密在于函数的数组参数并不是真正的数组,而是实实在在的指针,因此,上例和下例是等价的:
void f(char *a)
{
++a; /*certainlylegal*/
}
如果你希望上述函数中的数组名不能被修改,你可以将上述函数写成下面这样,但为此你必须使用指针句法:
void{(char *const a)
{
++a; /*illegal*/
}
在上例中,参数a是一个左值,但它前面的const关键字说明了它是不能被修改的。