为什么如果增加数组字符串会出现错误,而将值传递给函数却可以使之工作呢?字符串数组对象是否已经不是指向数组元素的指针?

例如

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/

10-11 03:17
查看更多