指针数组的一个重要应用是作为main函数的形参。在以往的程序中, main函数的第1行一般写成以下形式:
int main()
或
int main(void)
括号中是空的或有“void",表示main 函数没有参数,调用main函数时不必给出实参。这是一般程序常采用的形式。实际上,在某些情况下, main函数可以有参数,即:
int main(int argc, char * argv[])
其中, argc和 argv就是 main函数的形参,它们是程序的“命令行参数”。argc(argument count,意思是参数个数).argv(argumen vector 缩写,意思是参数向量),它是一个* char指针数组,数组中每一个元素(其值为指针)指向命令行中的一个字符串的首字符。
注意:如果用带参数的main函数,其第1个形参必须是int型,用来接收形参个数,第2个形参必须是字符指针数组,用来接收从操作系统命令行传来的字符串中首字符的地址。
通常main函数和其他函数组成一个文件模块,有一个文件名。对这个文件进行编译和连接,得到可执行文件(后缀为. exe)。用户执行这个可执行文件,操作系统就调用main函数,然后由main函数调用其他函数,从而完成程序的功能。
什么情况下main函数需要参数? main函数的形参是从哪里传递给它们的呢?显然形参的值不可能在程序中得到。main函数是操作系统调用的,实参只能由操作系统给出。在操作命令状态下,实参是和执行文件的命令一起给出的。例如在 DOS, UNIX 或Linux等系统的操作命令状态下,在命令行中包括了命令名和需要传给main函数的参数。
命令行的一般形式为
命令名参数1 参数2…参数n
命令名和各参数之间用空格分隔。命令名是可执行文件名(此文件包含main函数),假设可执行文件名为filel.exe,今想将两个字符串"China" ,"Beijing"作为传送给main 函数的参数。命令行可以写成以下形式:
file1 China Beijing
file1为可执行文件名,China和 Beijing是调用main函数时的实参。实际上,文件名应包括
盘符﹑路径,今为简化起见,用filel来代表。
请注意以上参数与main函数中形参的关系。main函数中形参argc是指命令行中参数的个数(注意,文件名也作为一个参数。例如,本例中“file1”也算一个参数)﹐现在,argc的值等于3(有3个命令行参数:file1,China,Beijing)。 main 函数的第2个形参argv是一个指向字符串的指针数组,也就是说,带参数的main函数原型是:
int main( int argc,char * argv[]);
命令行参数必须都是字符串,这些字符串的首地址构成一个指针数组.
指针数组argv中的元素argv[0]指向字符串"filel"的首字符(或者说argv[0]的值是字符串"file1"的首地址), argv[1]指向字符串"China"的首字符,argv[2]指向字符串"Beijing"的首字符。
如果有一个名为file1的文件,它包含以下的main函数:
int main(int argc,char * argv[])
{
while(argc>1)
{
++argv;
printf("%s\n",* argv);
--argc;
}
return 0;
}
在Visual C++环境下对程序编译和连接后,选择“工程”→“设置”→“调试”→“程序变
量”命令,输入"China Beijing" ,再运行程序,将会输出以下信息:China
Beijing
上面main函数可以改写为:
int main(int argc,char * argv[])
{
while( argc-->1)
printf("%s\n",* ++argv);
}
其中,“*++argv”是先进行++argv的运算,使argv指向下一个元素,然后进行*的运算,找到argv当前指向的字符串,输出该字符串。在开始时, argv指向字符串"file1",++argv使之指向"China" ,所以第1次输出的是"China",第2次输出"Beijing"。
echo命令
它的作用是实现“参数回送”,即将echo后面的各参数(各字符串)在同一行上输出。实现“参数回送”的C程序(文件名为echo.c)如下:
#include <stdio.h>
int main(int argc,char * argv[ ])
{while(--argc>0)
printf("%s%c",*++argv,(argc>1)?':'\n');
return 0;
}
当argc>1时,在输出的两个字符串间输出一个空格,当argc=1时输出1个换行.
为了便于理解,也可以写成以下形式:
#include<stdio.h>
int main(int argc,char * argv[])
{int i;
for(i= l;i<argc;i++)
printf("%s%c".argv[i],(i<argc—1)?'': '\n');
return 0;
}