argc和argv的目的是什么?

3
int main( int argc, char ** argv ){
//code here
 return 0; }   

我知道:
1. argc表示命令行参数的数量,包括文件名。 2. char **argv原本被表示为char * argv[]的数组中的char*。
假设我没错,那么相对较新的符号char **argv与char * argv[]有何不同?它指向什么?
我读了这篇文章 Where are C/C++ main function's parameters? ,但似乎只解释了参数所在位置而已。

@Jayesh,在函数声明的参数中,是的。 - eerorika
@user2079303 是的...作为参数是一样的。 - Jayesh Bhoi
@Jayesh,哦,我以为你在评论之前的评论,问他们是否相等:) 显然问号不是我最初想象的那样在结尾。 - eerorika
5
“相对较新”?它可能比您年龄还要大... - Lightness Races in Orbit
@user2079303 我以为你错过了 ? :) 所以.... - Jayesh Bhoi
显示剩余4条评论
2个回答

8

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函数声明符(包括原型)p15)“[...](在确定类型兼容性和复合类型时,每个声明为函数或数组类型的参数都被视为具有调整类型,而每个声明为限定类型的参数都被视为具有其声明类型的未限定版本。)”


我在某处读到,在C语言中,主函数可以从程序的任何地方调用。这是真的吗?它将如何工作? - Denson

3

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

void foo(int arr[]);

等价于

void foo(int *arr);

同样地,int *argv[] 等同于 int **argv
但需要注意的是,这只有在将数组类型作为函数参数时才成立,否则数组和指针是两种不同的类型。

假设我有两个函数: fun(char*)// 实际上这是一个数组
fun(char*)// 这是一个指针 当我调用这些函数时,编译器会如何解析这些函数调用?
- Denson
1
你不能在 char[]char* 参数上进行重载。尝试一下,编译器会报错。 - fredoverflow
我想它们不能被重载,正如@FredOverflow所指出的。 - Denson
1
@Denson;我更新了我的回答,请先阅读第一和第二行。 - haccks
@Griwes; 是的。已添加。 - haccks
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接