关于main函数的第二个参数

来源:互联网 发布:sql 2008 sa 密码 编辑:程序博客网 时间:2024/05/22 13:11

main函数的正规写法如下:int main(int argc,char *argv[], char *env[])

argv是执行程序时传递的参数,参数之间用空格隔开。是一维的char *数组。如果我们要传递的一个参数中间有空格,可以使用双引号把带空格的参数引起来,在main函数的栈里面双引号被自动去掉。在程序中我们经常使用argv+下标运算符来使用传递进来的某一个字符串,比如argv[1]参数,还可以用*(argv+1)含义:取argv这个char*的一维数组得第一个元素的值(这个值是char*类型,指向以空结尾的字符串)。

main函数也可以写成这样:int main(int argc,char **argv, char **env)

数组名是数组的首地址,就是数组的第一个元素的地址,那么char*类型的数组的第一个元素的地址应该是对char*取地址,即char**,值为&argv[0]或者argv+0。

那么main函数可不可以写成:int main(int argc,char argv[][], char env[][]),NO,不行。

原因一:main函数每个参数的长度不是定长,用一个定长的二维char数组来表示肯定不合理。

原因二:char argv[][] 这种写法本身就不对,压根就没有这种写法。有的写法是char pzStr[]="Hello",char S[][3]={"ab","cd","ef"}。系统不可能智能到自动判断每一维的大小。

分享一个小程序:

#include <stdio.h>int main(int argc, char **argv){char *pz1 = "anything";char *pz2 = "anything";printf("pz1=%x,pz2=%x", pz1, pz2);return 0;}
输出结果:

pz1和pz2存的地址是一样的,这个地址位于代码段和数据段之间的只读常亮区,只读常量区除了存放字符串,还存放const修饰的全局变量。

0 0
原创粉丝点击