为什么我增加一个数组字符串我得到一个错误,而如果我将值传递给一个函数我可以使它工作?字符串数组对象还不是指向数组元素的指针吗?
e.g。
void foo(char *a){
printf("%c", *a);
a++; // this works
printf("%c", *a);
}
int main(){
char a[] = "ciao";
a++; // I get the error
foo(a);
return 1;
}
谢谢!
答案 0 :(得分:7)
因为数组不是指针。在某些情况下,它们可能衰减指针(例如传递给函数,正如您在代码中看到的那样),但是,当它们仍然是数组时,您无法递增它们。
你可以做什么来创建一个来自数组的指针,例如通过改变:
foo(a);
为:
foo(&(a[1]));
将传递一个指向第二个字符的显式指针,而不是一个指向foo(a);
所发生的第一个字符的隐式指针。
C99的第6.3.2.1节(“左值,数组和函数指示符”),第3段有明确的理由说明为什么你不能做你想做的事情:
除非它是
sizeof
运算符或一元&
运算符的操作数,否则是 用于初始化数组的字符串文字,类型为“数组类型”的表达式将转换为类型为“指向类型的指针”的表达式,该表达式指向数组对象的初始元素,而不是左值。
这不是一个阻止你的“左右”。如果它不是左值,则无法更改它(因为它们通常出现在赋值语句的左侧,因此命名)。
您可以在第一个函数中执行的原因是因为第6.7.5.3节(“函数声明符”),第7段:
参数声明为“类型数组”应调整为“合格指向类型的指针”
换句话说,函数中的参数是一个左值指针,可以更改。
答案 1 :(得分:2)
你的foo的类型是一个指针,你可以递增。
你的主要类型a是一个数组,你不能增加它。
当您调用foo时,数组的地址将作为指针类型的新变量传递。您可以在不受原件影响的情况下增加此值。
答案 2 :(得分:1)
您可以尝试这样定义a
:
char* a = "ciao";