main函数中int argc和char *argv[]的含义,以及char **argv命名方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cynophile/article/details/79008122

这是main函数的固定写法,其中整型变量argc代表命令行总的参数的个数;argv是字符串数组,用来存放命令行各个参数的指针数组

argv[0]:指向程序的全路径名,argv[1]:指向在DOS命令行中执行程序名后的第一个字符串,argv[2]:指向第二个字符串以此类推。

新建一个工程,在命令行下输入如下几个参量:
-k Kinematic4.conf 20171219r.obs 20171219b.obs 20171219r.nav -o GPS-BDS-K-test.pos

数据导入
使用下述循环显示argv中各个参量

for (int count = 0; count < argc; count++)
    {
        printf("%d: %s\n", count, argv[count]);
    }

结果如下
结果


关于char *argv[]和char **argv命名方式的区别可以从字符串和字符串数组说起。
字符串:

 char argv[8]="beijing";
 char argv[8]={"b","e","i","j","i","n","g","\o"};
 char *argv ="beijing";

字符串可以有以上三种等价表述方式,其中第二种中使用”\o”的空字符,意味着字符串本质是以空字符(\o)结尾的char数组(所以字符串跟字符数组是有区别的,字符数组并不要求结尾有空字符)。

其中三者也有一定的区别,前两个是数组名argv是一个常量(数组名就是数组首元素的地址),而指针argv是一个变量(所以可以使用增量运算符,而数组名不可以),这个变量初始化的时候指向字符串的第一个字符,*argv=”b” ; printf(“%s”,argv))输出字符串;printf(“%c”,*argv)输出一个字符;


字符串数组:

 char *argv[3] = {"haidian","beijing","china"}; 
 char argv[3][8] = {"haidian","beijing","china"};

上述两种表述方法展现了一个简单的二维字符串数组(argv[0] = “haidian”,argv[1] =”beijing”,argv[2] =”china”)。
*argv[] 是一个指针数组,他的元素个数是argc个(例子中为3个),存放的是指向每一个参数的指针(一个char类型值的地址指向字符串数组中某一个字符串)。第一个指针是argv[0],它是指向第一个字符串的第一个字符(argv[0] = “haidian”;*argv[0]=’h’),第二个指针是argv[1],它是指向第二个字符串的第一个字符(,argv[1] =”beijing”;*argv[1]=’b’),后面以此类推。这里的argv数组实际上并不存放字符串,它只是存放字符串的地址(字符串存在程序用来存放常量的那部分内存中)。可以把argv[0]看作表示第一个字符串,*argv[0]看成表示第一个字符串的第一个字符,printf(“%s”,argv[i]))输出字符串;printf(“%c”,*argv[i])输出一个字符)。

将字符串数组和字符串中数组名和指针变量类比,char *argv[]和char **argv它俩有等价的效果。

猜你喜欢

转载自blog.csdn.net/cynophile/article/details/79008122