C语言中的指针-指针数组作 main 函数形参-学习笔记-41

引入

前面我们学习过指针数组,即数组的元素都是由指针地址组成的数组,指针数组可以很好的存储长度不同的数组地址,从而进行调用。但是指针数组最重要的作用是作为 main 函数的形参来使用的,今天我们就来看看。

main 函数中的参数

我们知道 main 函数的一般形式是

1
2
3
4
5
6
7
8
9
int main(){
....
return 0;
}
// 或者
int main(void){
...
return 0;
}

也就是说,main 函数的默认形参实际上是不存在的,也就是说,调用 main 函数的时候不用给出实参传递给 main 函数的形参。
在有些情况下,实际上 main 函数可以有参数的。

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

上面这个例子中,argc 和 argv都是 main 函数的形参。他们是程序的命令行参数

argc 是 argument count 的缩写,表示参数个数
argv 是 argument vector 的缩写,表示参数向量

argv 是一个 char *类型的指针数组,这个数组中的每一行元素都指向命令行中的一个字符串,也就是这个数组包含了很多字符串。

使用 main 函数参数

通常,我们的程序由:

  1. main 函数+其他函数组,组成一个文件模块
  2. 文件模块有一个文件名,编译器对这个文件进行编译和连接,得到可执行文件(.exe 文件)。
  3. 用户执行这个.exe 的可执行文件 ,操作系统就会调用 main 函数,main 函数再调用其它函数,从而完成程序的功能。

那么,在什么情况下需要 main 函数有参数呢?main 函数中的形参,从哪里如何传递给它呢?
main 既然是从操作系统调用,那么操作系统调用程序的 main 函数时,就可以给 main 函数传递实参过去了。

操作系统的实参

命令行中包括了命令名和需要传给 main 函数的参数

命令行的一般形式为:
命令名 参数1 参数2 …. 参数 n
(命令名和各参数之间用空格分隔)

命令名:即 .exe 可执行文件名,该文件包含 main 函数
例如:
可执行文件名为 demo.exe ,想传递过去的参数是 Beijing , China
那么可以写为如下形式:

1
demo China Beijing

deme 是可执行文件名
文件名实际上可能为:C:\\deme project\ demo.exe
China 和 Beijing 是传递给 main 的实参

main 函数接收实参

main 函数中 argc 是命令行中参数的个数
(文件名也是一个参数,也参与个数的运算)
所以,上面例子中,main 函数形参 argc 参数个数为:3

main 函数中 argv 是指向字符串的指针数组。
我们上面说,传递过来的参数个数为 3
所以这三个参数组成了一个指针数组传递给 argv

1
char *argv[]={"demo","China","Beijing"};

实际上 argv 接收到的是三个字符串的首元素地址。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
int main(){
void demo_main(int argc, char * argv[]);
char *demo_argv[]={"file_name","China","Beijing"};
demo_main(3,demo_argv);
return 0;
}

void demo_main (int argc, char * argv[]){
while(argc>1){
++argv;
printf("%s\n",*argv);
argc--;
}
}

我们写了一个 demo_main 作为模拟,实际上 main 函数接收到的实参,应该是由系统传递过来的。

实际上,main 函数的参数名不一定是 argv 和 argc,也可以是别的,只不过我们习惯这么写了而已。因为参数的长度我们事先不知道,所以利用指针数组可以很好的接收到这些参数,这就是 main 函数的形参以及指针数组的使用。

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。


-------------The End-------------
欢迎请我喝咖啡哦~!