指针算术与c中的char数组

frx*_*x08 2 c math pointers

为什么我增加一个数组字符串我得到一个错误,而如果我将值传递给一个函数我可以使它工作?字符串数组对象还不是指向数组元素的指针?

例如

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)

谢谢!

pax*_*blo 7

因为数组不是指针.它们可能会在某些情况下衰减成指针(例如传递给函数,正如您在代码中看到的那样)但是,虽然它们仍然是数组,但您无法递增它们.

可以做什么从数组创建一个指针,例如通过更改:

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段:

参数声明为"类型数组"应调整为"限定类型的指针"

换句话说,函数中的参数左值指针,可以更改.

  • +1:"数组不是指针",参见 http://c-faq.com/aryptr/aryptr2.html (2认同)