这主函数的形参乍一看略抽象啊,什么意思?主函数还有参数了?
这是用来在命令行里传递参数用的!
argc 记录命令行参数个数(以间隔为界,不含间隔);*argv[] 是个指针数组,分别指向每个参数。
例如:在命令行执行 a.exe username password ,则
argc 等于 3 ,
argv[0] 为 “a.exe”
argv[1] 为 “username”
argv[2] 为 “password”
又有这样的主函数:void main(int argc,char **argv) 这又是什么鬼?
其实和上面那个是一样的!这就涉及到数组和指针的关系问题了,他俩真是纠缠不清呢。
在C语言里,要想定义一个字符串,有两种办法:
1、定义一个字符数组:char a[] = "hello"
2、定义一个字符指针:char *b = "hello"
a 和 b 中存储的都是首字符的地址。我们可以通过 a[2] 得到 “l” ,而且,也可以通过 p[2] 得到 “l”。
printf(a) 和 printf(b) 是一样的。在打印时,printf()打印指向的这个字符,如果后面仍有字符,就挪动指针继续打印,直到 。
事实上,在通过a[2]取得元素值时,其内部就是通过指针方法得到的。
而两者的不同之处在于:
a 是一个常量,存储的是第一个字符的地址,是不可变的。比如 a++就是错的。
b 是个指针变量,存储第一个字符的地址,也就是字符串的地址,它是可变的,可以b++,还可通过 *(b+2) 得到 “l”。
插播一条基础知识:
回到上面 char *argv[] 和 char **argv 的问题,两者为什么是一样的呢?
char *argv[] 是一个指针数组(从右往左读,[]的优先级高于*,如果是char (*argv)[] 的话就是一个数组指针了),数组的每一项都是一字符指针,如下图:
char **argv 从右往左读-> (char *)(*argv) ,可以发现argv是一个指针,指向什么呢,指向字符指针!那么这是一个二级指针,字符指针的指针,相当于字符数组的数组。当取argv[1]时,也就得到第二个字符指针了。所以结构其实和上图是一样的。