一、参数的含义
1、int argc:用来统计程序运行时发送给main函数的命令行参数的个数(在VS中默认值为1)。
2、char *argv[]:字符串数组,用来存放指向的字符串参数的指针数组,每个元素指向一个参数。
argv[0]:指向程序运行的全路径名;
argv[1]:指向在DOS命令行中执行程序名后的第一个字符串;
argv[2]:指向执行程序名后的第二个字符串;
argv[argc]:为NULL;
二、参数:char *argv[] 和参数:char **argv 的区别
这两个参数都可以使用。
int main(int argc, char **argv)
1、char *argv[]
由于 [] 比 * 的运算等级高,所以argv是一个数组:argv[],然后它的元素类型为:char *;因此argv是一个元素为char * 型的数组。
2、char *s和char str[]的区别
C语言中没有真正的字符串类型,可以通过字符数组表示字符串,因为数组的元素地址是连续的。C语言中规定数组名代表数组所在内存中的首地址。也就是str[0]的地址。字符串常量的本质表示是一个地址。
s指针是char类型的,也可以保存字符串的地址(首地址),即第一个字符的地址,这个地址单元中的数据是一个字符,这也与s所指向的char一致。因此:s = a。
本质区别为:当定义char a[10]时,编译器会给数组分配十个单元内存,每个单元的数据类型为字符;而定义char *s 时,是个指针变量,只占四个字节,32位(或64位,根据系统的位数来定),用来保存一个地址。
C语言中操作字符串是通过它在内存中的存储单元的首地址进行的,这是字符串的终极本质。
3、char *argv[] 和 char **argv的区别
假设如下所示:
char **p = NULL; char *argv[] = {"abcd", "aaaa", "bbbb", "cccc"}; p = argv;
p[0]和p[1]之间相差sizeof(p)个地址。是按照一个单位指针的长度进行累加的。由于数组argv元素地址也是按照单位指针长度累加的,因此可以通过p来进行访问argv元素。可以通过以下例子验证:
#include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { char **p = NULL; char *a[] = {"abcd", "aaaa", "bbbb", "cccc"}; p = a; printf("%ld ", sizeof(p)); printf("address: %p value: %s ", &p[0], p[0]); printf("address: %p value: %s ", &p[1], p[1]); printf("address: %p value: %s ", &a[0], a[0]); printf("address: %p value: %s ", &a[1], a[1]); }
结果为:
ljs@ljs-PC:~/tcpip/10$ gcc wait.c -o wait
ljs@ljs-PC:~/tcpip/10$ ./wait
8
address: 0x7ffcbc32fb80 value: abcd
address: 0x7ffcbc32fb88 value: aaaa
address: 0x7ffcbc32fb80 value: abcd
address: 0x7ffcbc32fb88 value: aaaa