main_function

在 C 语言中,对于 main 函数的写法分两种:一种 main 函数是不带参数的,另一种是带有参数的。

一个简单的不带参数的 main 函数,如下所示:

1
2
3
4
5
#include <stido.h>

int main(){
    return 0;
}

另一种带有参数的 main 函数,如下所示:

1
2
3
4
5
#include <stido.h>

int main(int argc, char *argv[]){
    return 0;
}

虽然它们输出的结果相同,但argcargv到底是什么东西呢?

我们可以增加一条语句,让其输出argc,如下所示:

1
2
3
4
5
6
#include <stido.h>

int main(int argc, char *argv[]){
    printf("argc= %d\n", argc);
    return 0;
}

写好以后,在 Linux 环境下(其他环境也可以)用gcc进行编译,然后执行文件,如下所示:

1
2
3
4
[root@carol home]# gcc test.c -o test
[root@carol home]# ./test
argc = 1
[root@carol home]# 

可以看到输出了argc = 1,然后我们在./test后面多加几个字符,用空格隔开,再看看输出结果,如下所示:

1
2
3
4
5
6
7
8
9
[root@carol home]# ./test abc
argc = 2
[root@carol home]# ./test abc def
argc = 3
[root@carol home]# ./test abc def ghi
argc = 4
[root@carol home]# ./test abc def ghi 12312321
argc = 5
[root@carol home]# 

我们可以看到,根据命令行参数的不同,结果打印出不同的参数数量。所以,整型变量argc表示命令行中参数的个数,其中./test本身也是算一个参数,当我们在命令行中输入不同的实参后,即可把这些实参传送到 main 函数的形参argc中。

argc 即 argument count,表示参数的数量。

好,第一个参数知道了,现在来看看第二个参数argv

*argv[]表示指向指针的数组,因为它前面有个char,共同组成了char *argv[],所以它是指向字符串的指针数组。也可以将它写成char **argv

argv 即 argument vector,表示参数的向量。

前面我们在命令行输入的许多参数其实是保存在了argv数组当中,我们可以添加几条语句将其打印出来,如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#include <stdio.h>

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

重新编译后给它不同参数,然后执行文件,其输出结果如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@carol home]# gcc test.c -o test
[root@carol home]# ./test
argc = 1
./test
[root@carol home]# ./test abc
argc = 2
./test
abc
[root@carol home]# ./test abc def
argc = 3
./test
abc
def
[root@carol home]# ./test abc def ghi
argc = 4
./test
abc
def
ghi
[root@carol home]# ./test abc def ghi 21212
argc = 5
./test
abc
def
ghi
21212
[root@carol home]# 

可以看到被存在argv数组中的值被打印出来了。

总结一下:argc是命令行参数的个数,argv指向一个指针数组的首元素,数组中每个元素都是char *指针,指向整个命令行参数字符串。