我有这个小程序:

#include <stdio.h>

int main() {
    char *argv[3] = {{"abc"}, {"def"}, {"ghi"}};

    printf("%c\n", (*++argv)[1]); //error. I wanted to print 'b'
    printf("%c\n", *++argv[1]); //prints e

    return 0;
}

错误信息:
error: cannot increment value of type 'char *[3]'
printf("%c\n", (*++argv)[1]);

我想增加 argv 以指向 b 。我直接从 K&R 的 C 编程语言中采用了这种用法 (*++argv)[i],他们在第 117 页上有一个关于像我一样递增 argv 的示例。他们还指出 (*++argv)[0] 是指向字符串中第一个字符的指针,而 *++argv[0] 会增加指针 argv[0] 。实际上 (*argv)[1] 会打印 b*argv[1] 会打印 d 。然而不知何故增加 (*++argv)[0] 只会导致错误。

最佳答案

首先,这个:

char *argv[3] = {{"abc"},{"def"},{"ghi"}};

应该是这样的,正如其他人所指出的:
char *argv[3] = {"abc", "def", "ghi"};

其次,你所做的不是 K&R 书所做的。

数组名称就像它们是常量指针一样,因此您无法像尝试使用 argv = argv + 1 ( ++argv 的扩展版本)那样更改它们。

但是这本书对通过命令行 传递给 main 的 argv 这样做,所以当 char* argv[] 进入 main 时,它 衰减为指向指针的指针( char** ),然后,是的,如果你通过字符串作为命令行参数。

尝试像您一样在 main 中创建一个伪造的 (*++argv)[1],并将其相关地址与与通过命令行传递给 main 的真实 argv 相关的地址进行比较。

你会看到一个是 argv ,另一个是 char** :
#include <stdio.h>

int main(int argc, char* argv[])
{
    printf("argv:     %p\n", argv);
    printf("&argv[0]: %p\n", &argv[0]);
    printf("&argv:    %p\n\n", &argv);

    char* bogus_argv[] = {"abc", "def", "ghi"};
    printf("bogus_argv:     %p\n", bogus_argv);
    printf("&bogus_argv[0]: %p\n", &bogus_argv[0]);
    printf("&bogus_argv:    %p\n\n", &bogus_argv);

    printf("%c\n", (*++argv)[1]);  // prints 'b'
    printf("%c\n", *++argv[1]);    // prints 'e'

    return 0;
}

运行:char* array
我机器上的输出:
argv:     0x7ffcde5aca98
&argv[0]: 0x7ffcde5aca98
&argv:    0x7ffcde5ac9a0

bogus_argv:     0x7ffcde5ac980
&bogus_argv[0]: 0x7ffcde5ac980
&bogus_argv:    0x7ffcde5ac980

b
e

关于c - 在C中增加指向多维数组的指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41075108/

10-10 18:21
查看更多