在执行*++a
时,我得到“左值作为增量操作数”。我哪里错了?我认为它等同于*(a+1)
。这种行为很奇怪,因为*++argv
工作正常。请帮忙。
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Arg is: = %s\n", *++argv);
int a1[] = {1,2,3,4,5,6};
int a2[] = {7,8,9,10,11,12};
int *a[2];
a[0] = a1;
a[1] = a2;
printf("ptr = %d\n", *++a);
return 0;
}
答案 0 :(得分:5)
a
是一个常量(数组名称),您无法通过++a
更改其值,即等于a = a + 1
。
对于此尝试*a = *a + 1
,您可能希望执行*a++
(递增0索引值)。注意我已将++
从前缀更改为后缀。
注意:char* argv[]
定义为函数参数,argv
是char**
类型(char*[]
)的指针变量。
而在您的代码中int* a[]
不是函数参数。这里a
是一个int类型的数组(int*
)(数组名称是常量)。记住函数参数和正常声明中的声明是不同的。
此外,通过++
使用argv
和a
您只是发现了一个区别,如果您使用sizeof
运算符打印大小,您可以观察到一个更有趣的差异。例如,检查此工作代码Codepade
int main(int argc, char* argv[]){
int* a[2];
printf(" a: %u, argv: %u", sizeof(a), sizeof(argv));
return 1;
}
输出是:
a: 8, argv: 4
系统中的地址大小为四个字节。输出8
是数组a
的大小,由两个int地址类型的元素组成(因为a
是数组),而4
的大小是argv
(因为argv
是指针)。
答案 1 :(得分:4)
++a
和a + 1
不相同。 ++a
与a = a + 1
相同,即它会尝试修改a
并要求a
为可修改的左值。数组不是可修改的左值,这就是为什么你不能用数组做++a
。
argv
参数列表中的 main
声明不是数组,这就是++argv
的原因。在函数参数列表中使用a[]
声明时,这只是指针声明的语法糖。即
int main(int argc, char *argv[])
相当于
int main(int argc, char **argv)
但是当你将数组声明为局部变量时(如你的问题所示),它确实是一个真正的数组,而不是一个指针。它不能“递增”。
答案 2 :(得分:3)
数组不是指针。 a
是一个数组;你无法增加数组。