返回首页   进站必读

15.6 指针数组的使用


15.6 指针数组的使用

我们知道main函数的标准原型应该是 int main(int argc, char *argv[]); argc是命令行参数的个数。而argv是一个指向指针的指针, 为什么不是指针数组呢?因为前面讲过,函数原型中的表示指针而不表示数组, 等价于 char **argv。 那为什么要写成 char *argv[] 而不写成 char **argv 呢?这样写给读代码的人提供了有用信息,argv不是指向单个指针, 而是指向一个指针数组的首元素。数组中每个元素都是 char *指针, 指向一个命令行参数字符串。

例 23.2. 打印命令行参数

#include <stdio.h>

int main(int argc, char *argv[])
{
	int i;
	for(i = 0; i < argc; i++)
		printf("argv[%d]=%s\n", i, argv[i]);
	return 0;
}

编译执行:

$ gcc main.c
$ ./a.out a b c
argv[0]=./a.out
argv[1]=a
argv[2]=b
argv[3]=c
$ ln -s a.out printargv
$ ./printargv d e 
argv[0]=./printargv
argv[1]=d
argv[2]=e

由于argv4是NULL,我们也可以这样循环遍历argv:

for(i=0; argv[i] != NULL; i++)

NULL标识着argv的结尾,这个循环碰到NULL就结束,因而不会访问越界,这种用法很形象地称为Sentinel,NULL就像一个哨兵守卫着数组的边界。