在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
也不是指向数组中第一个元素的指针吗?
答案 0 :(得分:2)
sizeof(a)
是数组占用的字节数。你想要,例如sizeof(a) / sizeof(a[0])
。
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