对argc,argv及其用法的有趣观察

Bra*_*don 3 c linux pointers argv

所以,我正在研究一个基于Linux的命令行实用程序,它必须接受一些标志,我注意到了一些有趣的行为.我将发布我在主实用程序之外使用的测试代码.我正在使用这段代码,所以在我可以插入工作代码之前,我没有必要改变实际的实用程序.所以这是我一直在摆弄的代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    while(--argc && (*++argv)[0] == '-') 
        putchar('*');

    printf("\n%s\n", argv[0]);
 }   
Run Code Online (Sandbox Code Playgroud)

请忽略这样一个事实,即所有这个程序都打印星号,并在使用一个参数-b调用时打印自己的名称.打印星号只是为了表明循环运行一次.所以,我在终端中以"./test -n"运行它,我希望输出为:

*./测试

令我惊讶的是,输出结果如下:

*-b

我有一个关于声明(*++argv)[0]正在做什么的工作理论 ,但我仍然有点朦胧.我的假设是它遍历指针数组,查看指向的每个字符串中的第一个字符,(*++argv)[0]现在*argv[0]是第一个参数字符串的解除引用或元素零.

所以,基本上我有三个问题:

  1. 这句话到底在做什么?
  2. 为什么我不能回到argv [0]或argv [0] [0],无论我尝试什么?
  3. 将值存储在另一个char*中argv [0]指向的地址,这是我此时能够访问该值的唯一方法,这是正常的方法吗?

我现在对此感到很困惑,并尝试了我能想到的一切来解决这个问题.有一次我有一个打印字母表的循环,我不知道程序访问的内存部分.最有趣的排列是从某个地方提取sshid变量.

提前感谢大家的帮助.

Ben*_*igt 6

++argv更改argv指向下一个参数.

尝试类似的东西

int i = 0;
while(--argc && argv[++i][0] == '-')
Run Code Online (Sandbox Code Playgroud)

它维护一个单独的索引,而不是覆盖argv.

要么

char** argp = argv;
while(--argc && (*++argp)[0] == '-')
Run Code Online (Sandbox Code Playgroud)

它与原始版本的工作原理相同,只是它更改了原件的副本argv而不是原件.

  • 它只是在*C*中递增数组指针的语义.它与程序参数传递没有任何关系. (3认同)