argc 和 argv 的目的是啥? [复制]

Posted

技术标签:

【中文标题】argc 和 argv 的目的是啥? [复制]【英文标题】:what is the purpose of argc and argv? [duplicate]argc 和 argv 的目的是什么? [复制] 【发布时间】:2014-08-04 00:01:04 【问题描述】:
int main( int argc, char ** argv )
//code here
 return 0;    

我知道:

    argc 表示命令行参数的个数,包括文件名 char ** argv 应该是 char* 到最初表示为 char* argv[] 的数组

假设我是对的,与 char * argv[] 相比,相对较新的符号 char **argv 是什么?它指向什么?

我读了这篇文章 Where are C/C++ main function's parameters? 但是它似乎解释了参数在哪里,没有别的。

【问题讨论】:

它们实际上是相等的 char **argv and char * argv[]? 相等。 @Jayesh,在函数声明的参数中,是的。 @user2079303 是的..作为参数是相同的。 “比较新”?它可能比你的年龄大...... 【参考方案1】:

C 标准中带参数的main 原型是:

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

现在在 C 中,数组类型的函数参数被调整 1) 为类型指针,即:

void foo(T param[])

等价于

void foo(T *param)

所以使用char *argv[]char **argv 作为main 参数是完全一样的。


1) (C99, 6.7.5.3 Function declarators (including prototypes) p15) "[...] (在确定类型兼容性和复合类型时,以函数或数组类型声明的每个参数都被视为具有调整后的类型和使用限定类型声明的每个参数都被视为具有其声明类型的非限定版本。)"

【讨论】:

我在某处读到,在 c 中,主函数可以从程序的任何位置调用。这是真的?它将如何工作?【参考方案2】:

在 C/C++ 中,您不能将数组按值传递给函数。可以传递指向数组或其引用的指针。用作函数参数时,数组类型等价于指针类型,即

void foo(int arr[]);

等价于

void foo(int *arr);

同样int *argv[] 等价于int **argv。 但请注意,仅当数组类型用作函数的参数时才适用,否则数组和指针是两种不同的类型。

【讨论】:

说我有两个函数 fun(char*)// 这实际上是一个数组 fun(char*)// 当我调用这些函数时这是一个指针,编译器将如何解析函数调用? 您不能重载char[]char* 参数。试试吧,编译器会报错的。 @Denson;你的意思是fun(char [])fun(char *) @hacks 这就是我的意思,但正如你指出的那样,两者都等同于函数参数 @Denson;我更新了我的答案。阅读第一行和第二行。

以上是关于argc 和 argv 的目的是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

将argv和argc传递给线程

为啥要检查 (*argv == NULL)? [复制]

linux下用c语言写出复制黏贴文件

构建 argv 和 argc

**kwargs 的目的和用途是啥? [复制]

关于 argc(不知道它是啥意思)