char * argv []是什么意思?

时间:2013-05-21 09:19:03

标签: c arrays pointers kernighan-and-ritchie

我是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?这不是数组名吗?

7 个答案:

答案 0 :(得分:20)

参数 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 {1}}。

{{1}}

答案 1 :(得分:3)

argvchar*的数组。执行++argv表示访问阵列的下一个单元格。 *表示我们需要单元格的值,而不是地址。

答案 2 :(得分:2)

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

所有数组都衰减为指针,因此您可以使用数组作为指针(就像您可以将指针用作数组一样)。所以*++argv首先增加“指针”以指向数组argv中的下一个条目(第一次在循环中将是第一个命令行参数)并取消引用该指针。

答案 3 :(得分:2)

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

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;
}

答案 4 :(得分:2)

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

答案 5 :(得分:-1)

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

argc在一个包含参数数量的整数中,argc是一个指向包含实际参数的字符串数组的指针。

答案 6 :(得分:-1)

这里做的是指针算法。

指针并未真正改变。

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

因为操作符++放在argv之前,所以首先获取地址,然后递增,然后取消引用以获取此地址后面的char *。

但它不是地址本身,它会被改变,只是偏移,从printf读取的位置。

好吗?