int main(int argc,char* argv[]) 也可以写成 int main(int argc,char** argv)。
argc表示程序运行时发送给main函数的命令行参数的个数(包括可执行程序以及传参)。
argv[]是字符指针数组,它的每个元素都是字符指针,指向命令行中每个参数的第一个字符。

  • argv[0]指向可执行程序。
  • argv[1]指向可执行程序后的第一个字符串。
  • argv[2]指向可执行程序后的第二个字符串 。
  • argv[3]指向可执行程序后的第三个字符串 。
  • argv[argc]为NULL。

比如在linu系统下使用vim编写以下代码,并保存为sample.c。

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

然后用“gcc sample.c -o sample.out”编译得到sample.out后,输入“./sample.out aa bb cc”执行。

xjh@ubuntu:~/iot/tmp$ gcc sample.c -o sample.outxjh@ubuntu:~/iot/tmp$ lssample.csample.outxjh@ubuntu:~/iot/tmp$ ./sample.out aa bb cc4 //显示有4个参数,显然把可执行程序也当做参数了./sample.out aabbccxjh@ubuntu:~/iot/tmp$ 

从结果argc=4可知,可执行程序也属于参数之一。

既然可执行程序也属于参数之一,为何下面情况显示的参数个数不是5个呢?
比如有一个名为shell.sh的脚本,其内容如下:

#!/bin/bashecho "shell_0:$0"echo "shell_1:$1"echo "shell_2:$2"echo "shell_3:$3"echo "shell_4:$4"echo "arg_number:$#"#注意,$#表示传给脚本的参数个数

执行该脚本的时候,结果如下:

xjh@ubuntu:~/iot/tmp$ ./shell.sh aa1 bb2 cc3 dd4 shell_0:./shell.sh//$0的值shell_1:aa1 //$1的值shell_2:bb2 //$2的值shell_3:cc3 //$3的值shell_4:dd4 //$4的值arg_number:4//$#表示参数的个数。上面说可执行程序也属于参数,那这里的参数个数为何不是5个?xjh@ubuntu:~/iot/tmp$ 

猜想

(1)$#尽管表示参数的个数,但可能它表示的是实际传参的个数,不包括可执行程序?(待求证)(2)现在先这样记住main函数的argc表示参数个数,包括可执行程序;shell脚本里的参数个数不包括可执行程序,$0表示可执行程序,$1表示第一个参数。

补充说明
main函数的原型还可以是:int main(int argc, char **argv, char **env)
其中第三个参数是一个字符串数组,表示环境变量。

#include  // env就是我们给main函数额外传递的环境变量字符串数组int main(int argc, char **argv, char **env){int i = 0;printf("argc = %d.\n", argc);while (NULL != argv[i]){printf("argv[%d] = %s\n", i, argv[i]);i++;}i = 0;while (NULL != env[i]){printf("env[%d] = %s\n", i, env[i]);i++;}return 0;}

输出结果

xjh@ubuntu:~/iot/tmp$ ./a.out argc = 1.argv[0] = ./a.outenv[0] = XDG_VTNR=7env[1] = LC_PAPER=zh_SG.UTF-8env[2] = LC_ADDRESS=zh_SG.UTF-8env[3] = XDG_SESSION_ID=c2env[4] = XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/xjhenv[5] = SELINUX_INIT=YES//省略