说到C
我知道了
void main (int argc, char *argv[])
是将参数传递给main的正确方法 但出于好奇,我写了
void main (int argc, char *argv[1])
和程序,编译后显示与前一个完全相同的结果。
我在第二个版本中做了什么,有人可以解释一下吗?
提前谢谢。
答案 0 :(得分:7)
void main (int argc, char *argv[1])
和
void main (int argc, char *argv[])
是等价的。
argv
是一个指针(char**
),main()
中为其指定的大小不是argv
中字符串的实际大小 - 因为数组传递给函数转换为指向其第一个元素的指针。基本上,编译器会忽略大小值。
出于同样的原因,您可以指定:
void main (int argc, char *argv[101])
它仍然可以按照您的预期运作。 阅读代码的任何人都会感到困惑。但它完全有效。
答案 1 :(得分:0)
首先,说到C,main()
的返回类型应为int
。
这来自C语言标准:
5.1.2.2.1程序启动
1.程序启动时调用的函数名为main
。 实施声明否 这个功能的原型。它应定义为返回类型int
且没有 参数:
int main(void) { /* ... */ }
或有两个参数(此处称为
argc
和argv
,但可能有任何名称 使用,因为它们是声明它们的函数的本地):
int main(int argc, char *argv[]) { /* ... */ }
或同等的;或者以其他一些实现定义的方式。
第二,char *argv[]
允许多个命令行参数。尽管char *argv[0]
看起来很奇怪但有效,但通常会以编程方式处理命令行参数解析器。
下面是一个代码示例,演示char *argv[0]
不会影响命令行参数解析:
#include <stdio.h>
int main(int argc, char *argv[0])
{
for (int i = 0; i < argc; i++)
printf("%s\n", argv[i]);
return 0;
}
答案 2 :(得分:0)
在函数参数声明的上下文中,T a[N]
和T a[]
都等同于T *a
;他们将a
声明为指向T
的指针。
如果是argv
,T
是char *
。
如果T
是数组类型R [M]
,则R a[N][M]
和R a[][M]
等同于R (*a)[M]
;他们将a
声明为指向R
数组的指针。