指针算术与c中的char数组

时间:2011-02-21 09:50:23

标签: c pointers math

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

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;
}

谢谢!

3 个答案:

答案 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";