[1] 前面已经提到过,对于下面的代码:
char s1[]="hello";
char *s2="hello";
s2是指向常量的指针,只能访问不能修改;s1是字符串的首地址,可以访问,可以修改值。
[2] 新的问题
对于下面的的函数,希望能够在调用函数后修改s的地址
void fun(char *&s)
{
s++;
}
用同样的s1,s2调用该函数:
fun(s1);//1-语法错误
fun(s2);//2-正确,且执行后s2的值会+1
语句1根本不能通过语法检查。
由此可见s[] 和*s并不仅仅是能否改变的差别!
具体解释
在《C++ Primer 第四版》的第七章中,讲到了通过引用传递数组,和其他类型一样,数组形参可声明为数组的引用。如果形参是数组的引用,编译器不会将数组实参转化为指针,而是传递数组的引用本身。在这种情况下,数组大小成为形参与实参类型的一部分,编译器检查数组实参的大小与形参的大小是否匹配。——from 沧南