为什么如果增加数组字符串会出现错误,而将值传递给函数却可以使之工作呢?字符串数组对象是否已经不是指向数组元素的指针?
例如
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;
}
谢谢!
最佳答案
因为数组不是指针。在某些情况下(例如,传递给函数,如您在代码中看到的那样),它们可能会衰减为指针,但是,尽管它们保留为数组,但无法对其进行递增。
您可以执行以下操作从数组创建指针,例如通过更改:
foo(a);
至:
foo(&(a[1]));
它将通过显式指针指向第二个字符,而不是与
foo(a);
一起出现的第一个字符的隐式指针。C99的6.3.2.1节(“左值,数组和函数指示符”)的第3段具有明确的原因,导致您无法执行要执行的操作:
除非它是
sizeof
运算符或一元&
运算符的操作数,或者是用于初始化数组的字符串文字,类型为“ array of type”的表达式将转换为类型为“ pointer to type”的表达式,该表达式指向数组对象的初始元素,而不是左值。
是因为“不是左值”阻止了您。如果它不是左值,则不能更改它(之所以命名是因为它们通常出现在赋值语句的左侧)。
之所以可以执行第一个函数,是因为第6.7.5.3节(“函数声明器”)第7段:
参数声明为“类型数组”应调整为“类型的合格指针”
换句话说,函数中的参数是一个左值指针,可以更改。
关于c - c中带有char数组的指针算术,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5064443/