在 C 语言中,定义函数的入口有:
int main(int argc, char* argv[])
其中:
argc --- 定义了执行程序时,携带的参数,其中,也把程序本身的程序名也算在一起;
argv[] --- 存放了程序名 和 携带的参数;
假设程序编译为 out,那么,执行程序
./out www 123
此时:
argc == 3;
argv[0] == ./out
argv[1] == www
argv[2] == 123
//========================================================================
那么,我们知道 char* argv[] 是一个“数组指针”,每一个元素,存放一个指针,指向存放参数的地址;
但是,我们有一个疑问,对应 ./out www 123 这样的数据,是否存在一个“连续的内存块”中呢?
//========================================================================
下面编写程序测试,发现 ./out www 123 这样的字符串参数,存放在一个连续的内存块中;
而且,每一个参数之间,有“字符串”结束符;
我们在测试的时候,为了测试的方便,直接输出 argv[] 地址后的 20 个字符,不考虑内存越界;
输出结果如下:
[0].
[1]/
[2]o
[3]u
[4]t
[5]
[6]w
[7]w
[8]w
[9]
[10]1
[11]2
[12]3
[13]
[14]O
[15]R
[16]B
[17]I
[18]T
[19]_
可以看到,第 5,9,13 这样的元素,存放了“字符串”结束符 0 值;
//=================================================================
#include <unistd.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
int i, len;
char* p;
printf("argc = %d\n", argc);
printf("optind = %d\n", optind);
p = *argv;
printf("p = %s\n", p);
len = strlen(p);
printf("len = %d\n", len);
printf("====================\n");
for(i = 0; i < 20; i++)
{
printf("[%d]%c \n", i, p[i]);
}
printf("\n");
return 0;
}
运行结果如下:
[openwrt@localhost64 test]$ ./out www 123
argc = 3
optind = 1
p = ./out
len = 5
====================
[0].
[1]/
[2]o
[3]u
[4]t
[5]
[6]w
[7]w
[8]w
[9]
[10]1
[11]2
[12]3
[13]
[14]O
[15]R
[16]B
[17]I
[18]T
[19]_
[openwrt@localhost64 test]$
只需要99元就可以投资自己,掌握Linux系统编程!主要传授《Linux C/C++程序设计》《Linux 系统编程》,主页有学习视频!
只需要99元就拥有全部课程和资料,让我们用技术改变自己,改变生活,改变世界!
视频可以百度搜索:韦凯峰Linux编程学堂