我有这个小程序:
#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/