使用++递增数组指针

时间:2015-03-05 19:02:05

标签: c arrays pointers

在C中,我知道你可以像这样打印数组的不同元素

int a[5] = {1,2,3,4,5};
printf("%d", *(a+2));

但为什么以下print语句导致错误?

printf("%d", a++);

错误是:

error: cannot increment value of type 'int [5]'

我知道a是类型数组,你不能递增数组,但是a也不是指向数组中第一个元素的指针吗?

3 个答案:

答案 0 :(得分:2)

sizeof(a)是数组占用的字节数。你想要,例如sizeof(a) / sizeof(a[0])

如果转换为1,

a会分解为指向数组中第一个元素的指针。由于它是您示例中的数组,因此您无法增加它。

你能做的是:

int a[] = {...};
int *aptr = a; // a has decomposed into a pointer

aptr++; // etc.

答案 1 :(得分:2)

是的,a是一个数组,你无法增加数组。

您可以递增指针对象,但不能递增指针。 (类似地,您可以递增整数对象i ++,但不能递增整数值42 ++。)

数组不是指针。在大多数情况下,数组类型的表达式被隐式转换为指向相应数组对象的第一个(第0个)元素的指针。结果指针是指针(地址);没有指针 object 被创建,所以没有任何东西可以增加。

++运算符可以应用于指针表达式,但前提是它是可修改的左值。 ( lvalue 基本上是一个引用对象的表达式。并非所有左值都是可修改的;例如,const - 限定对象的名称不可修改。)

你的陈述a是"也是指向数组中第一个元素的指针"部分是正确的,但可能具有误导性。 a仍然是数组对象的名称,但表达式 a在此上下文中确实产生指针值。

答案 2 :(得分:0)

始终记住数组(在表达式中使用)不可修改。这意味着它无法在任何情况下进行修改。

a = a+1; // WRONG  
a++;     // WRONG   
++a;     // WRONG