递增数组变量时,左值不一致所需的错误

时间:2013-07-09 04:39:07

标签: c++ c pointers

在执行*++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;
}

3 个答案:

答案 0 :(得分:5)

a是一个常量(数组名称),您无法通过++a更改其值,即等于a = a + 1
对于此尝试*a = *a + 1,您可能希望执行*a++(递增0索引值)。注意我已将++从前缀更改为后缀。

注意:char* argv[]定义为函数参数,argvchar**类型(char*[])的指针变量
而在您的代码中int* a[]不是函数参数。这里a是一个int类型的数组(int*)(数组名称是常量)。记住函数参数和正常声明中的声明是不同的。

此外,通过++使用argva您只是发现了一个区别,如果您使用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)

++aa + 1不相同。 ++aa = a + 1相同,即它会尝试修改a并要求a为可修改的左值。数组不是可修改的左值,这就是为什么你不能用数组做++a

argv参数列表中的

main声明不是数组,这就是++argv的原因。在函数参数列表中使用a[]声明时,这只是指针声明的语法糖。即

int main(int argc, char *argv[])

相当于

int main(int argc, char **argv)

但是当你将数组声明为局部变量时(如你的问题所示),它确实是一个真正的数组,而不是一个指针。它不能“递增”。

答案 2 :(得分:3)

数组不是指针。 a是一个数组;你无法增加数组。