我们一般在使用main函数时,不使用它的参数(main()或main(void)),但其实,main函数有参数而且参数有很大的作用。
主函数实际上有三个参数: argc:表示有命令行参数个数,第一个为可执行行程序名,argc最少为1。 argv:参数名。 envp:系统的环境变量,很少使用,下文不使用该参数。 tip:主函数带参数,第一个参数必须是int型,用来接收形参个数,第二个参数必须是字符指针数组,用来接收从操作系统命令行传来的一个字符串的地址。 主函数参数来源: 主函数的参数其实是程序的“命令行参数”,argc(argument count)是参数个数,argv(argument vector)是参数向量,是一个char *类型指针数组,数组中的每一个元素(其值为指针)指向命令行中的一个字符串的首字符。 主函数由操作系统调用,其参数也由操作系统传递,在DOS,UNIX和LINUX操作系统的命令行中包括了命令名和传递给主函数的参数。 命令行的一般格式: 命令名 参数1 参数2 ··· 参数n
//我们用程序来看一下操作系统命令行给主函数传参 #include <stdio.h> int main(int argc,char * argv[]) { int i; printf("we have %d argument\n",argc); for(i=0; i<argc; i++) { printf("NO.%d argument is %s\n",i+1,argv[i]); } return 0; return 0; }在linux下跑的结果: main函数的第二个参数的不同写法: int main(int argc,char * argv[])≈int main(int argc,char **argv)
二维数组,长得跟我们上面的参数差不多,但实际上完全不是一回事。 在C语言中,数组名是数组首元素的地址,所以数组名的作用相当于一个指针。
#include <stdio.h> int main() { int array[5][5] = {0}; int * p = array; printf("p:%p\n",p); printf("array:%p\n",array); return 0; } *********************** 结果: p:0060FE98 array:0060FE98所以,char argv[5][5]可以理解为char (*p)[5][5],p为指向5x5个元素的二维数组的指针变量
指针数组,其元素是指向字符型数据的指针元素。 我们可以将它拆开理解,(char *)(argv[]),argv[]这个数组是char *类型的,其元素是指向字符型数据的指针。 区别另一个变量的定义:char ( * p)[],p指向字符型的一维数组的指针变量,在C语言里,数组名在编译时作为指针使用,原理上数组名可被认为是一个指针(不是变量,数组名是固定指向第一个元素)
char **argv是一个二重指针。 char **argv≈char * argv[] 第2条中已说明,数组名可当做指针来使用,原理上char **argv和char *argv[]都是通过“二级间址”的方式来访问字符串变量。
我们可以画个图来理解。
所以,我们一般认为char * argv[]和char ** argv的定义时一样的,其区别就在于前者可以用下标来访问其元素,后者需要用到指针的运算。