为什么我增加一个数组字符串我得到一个错误,而如果我将值传递给一个函数我可以使它工作?字符串数组对象还不是指向数组元素的指针?
例如
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;
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
因为数组不是指针.它们可能会在某些情况下衰减成指针(例如传递给函数,正如您在代码中看到的那样)但是,虽然它们仍然是数组,但您无法递增它们.
您可以做什么从数组创建一个指针,例如通过更改:
foo(a);
Run Code Online (Sandbox Code Playgroud)
至:
foo(&(a[1]));
Run Code Online (Sandbox Code Playgroud)
它会将一个显式指针传递给第二个字符,而不是一个指向第一个字符的隐式指针foo(a);.
C99的第6.3.2.1节("左值,数组和函数指示符"),第3段有明确的理由说明为什么你不能做你想做的事情:
除非它是运算
sizeof符或一元运算&符的操作数,或者是用于初始化数组的字符串文字,否则将类型为"数组类型"的表达式转换为类型为"指向类型的指针"的表达式,该表达式指向数组对象的初始元素,而不是左值.
这不是一个阻止你的"不是左撇子".如果它不是左值,则无法更改它(因为它们通常出现在赋值语句的左侧,因此命名).
您可以在第一个函数中执行的原因是因为第6.7.5.3节("函数声明符"),第7段:
参数声明为"类型数组"应调整为"限定类型的指针"
换句话说,函数中的参数是左值指针,可以更改.