4

我在做*++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;
}
4

3 回答 3

5

a是一个常量(数组名称),您不能通过 更改其值++a,即等于a = a + 1
您可能想这样做*a = *a + 1(增加 0 索引值),*a++而不是尝试。请注意,我++已从前缀更改为后缀。

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

此外,通过使用++with argva您会发现一个差异,如果您使用sizeofoperator 来打印大小,您可以观察到一个更有趣的差异。例如检查这个工作代码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是指针)。

于 2013-07-09T04:43:03.123 回答
4

++a并且a + 1不等价。++a与 相同a = a + 1,即它尝试修改a并要求a是可修改的左值。数组不是可修改的左值,这就是为什么不能++a使用数组的原因。

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

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

相当于

int main(int argc, char **argv)

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

于 2013-07-09T04:42:49.293 回答
3

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

于 2013-07-09T04:41:16.133 回答