char * argv[] 是什么意思?

问题描述 投票:0回答:7

我是 C 编程新手,遇到了问题。
如果声明很复杂,我发现了这个

int *daytab[13]; // daytab is an array of 13 pointers to int

这意味着

daytab
是数组的名称,数组的名称指向数组的第一个元素。数组名称与指针操作不兼容,如
daytab++
等(如果我错了,请纠正我)。

但是我发现这段代码是用 Dennis Ritchie 写的

main(int argc, char * argv[]) {
    while( --argc > 0 )                    
        printf("%s%s",*++argv,(argc>1) > " " : "");

    printf("\n");
    return 0;
}

他们如何操纵

argv
?这不是数组名吗?

c arrays pointers kernighan-and-ritchie
7个回答
31
投票

参数

char * argv[]
衰减为指针
char ** argv
。您同样可以将
main()
的函数签名写为:

int main(int argc, char ** argv)

您可以使用指针

argv
main()
内执行您喜欢的操作,因此
argv++
例如只是碰撞
argv
来指向
argv[1]
而不是
argv[0]

argv ---> argv[0] ---> "program"
          argv[1] ---> "arg1"
          argv[2] ---> "arg2"
           ...          ...
          argv[argc] == NULL

5
投票

当程序启动时,它会在主函数中获取其参数。这就是你通常写作的原因。

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

这仅仅意味着 argv 是一个指向 argc (== 参数计数)所指示的参数字符串的指针。由于 argv 衰减为 char **argv 您也可以增加它,或者像指针一样。

因此,如果您想从命令行打印所有参数:

int main(int argc, char *argv[])
{
   for(int i = 0; i < argc; i++)
       printf("%s\n", argv[i]);

   for(int i = 0; i < argc; i++)
       printf("%s\n", argv++);

    return 0;
}

5
投票

argv
char*
的数组。执行
++argv
意味着访问数组的下一个单元格。
*
表示我们想要单元格的值,而不是地址。


4
投票

声明

char *argv[]
是一个指向
char
的指针数组(大小未定),换句话说,是一个字符串数组。

所有数组都会衰减为指针,因此您可以将数组用作指针(就像可以将指针用作数组一样)。因此

*++argv
首先增加“指针”以指向数组中的下一个条目
argv
(循环中的第一次将是第一个命令行参数)并取消引用该指针。


2
投票

参数声明看起来类似于数组的声明,但实际上(因为它是一个函数参数)它不是一个。 C FAQ 很好地解释了这一点。


0
投票

argc
argv
是传递给程序主函数的参数。

argc
是一个保存参数数量的整数,
argv
是一个指向保存实际参数的字符串数组的指针。
argv
引用的每个元素均由空格分隔。


-1
投票

这里所做的是指针运算。

指针并没有真正改变。

使用指针的地址,暂时递增,然后用于输出。

因为运算符++放在argv之前,所以首先取地址,然后递增,然后解引用以获取该地址后面的char*。

但改变的不是地址本身,而是 printf 读取的偏移量。

好的?

© www.soinside.com 2019 - 2024. All rights reserved.