C语言进修教程第六章-指针(7)
main函数的参数
前面先容的main函数都是不带参数的。因此main 后的括号都是空括号。实际上,main函数可以带参数,这个参数可以认为是 main函数的形式参数。C语言划定main函数的参数只能有两个, 习惯上这两个参数写为argc和argv。因此,main函数的函数头可写为: main (argc,argv)C语言还划定argc(第一个形参)必需是整型变量,argv( 第二个形参)必需是指向字符串的指针数组。加上形参说明后,main函数的函数头应写为:
main (argc,argv)
int argv;
char *argv[];或写成:
main (int argc,char *argv[])
由于main函数不能被其它函数挪用, 因此不行能在措施内部取得实际值。那么,在那里把实参值赋予main函数的形参呢? 实际上,main函数的参数值是从操纵系统呼吁行上得到的。当我们要运行一个可执行文件时,在DOS提示符下键入文件名,再输入实际参数即可把这些实参传送到main的形参中去。
DOS提示符下呼吁行的一般形式为: C:\>可执行文件名 参数 参数……; 可是应该出格留意的是,main 的两个形参和呼吁行中的参数在
位置上不是一一对应的。因为,main的形参只有二个,而呼吁行中的参数个数原则上未加限制。argc参数暗示了呼吁行中参数的个数(留意:文件名自己也算一个参数),argc的值是在输入呼吁行时由系统按实际参数的个数自动赋予的。譬喻有呼吁行为: C:\>E6 24 BASIC dbase FORTRAN由于文件名E6 24自己也算一个参数,所以共有4个参数,因此argc取得的值为4。argv参数是字符串指针数组,其各元素值为呼吁行中各字符串(参数均按字符串处理惩罚)的首地点。 指针数组的长度即为参数个数。数组元素初值由系统自动赋予。其暗示如图6.8所示:
main(int argc,char *argv){
while(argc–>1)
printf("%s\n",*++argv);
}
本例是显示呼吁行中输入的参数假如上例的可执行文件名为e24.exe,存放在A驱动器的盘内。
因此输入的呼吁行为: C:\>a:e24 BASIC dBASE FORTRAN
则运行功效为:
BASIC
dBASE
FORTRAN
该行共有4个参数,执行main时,argc的初值即为4。argv的4个元素分为4个字符串的首地点。执行while语句,每轮回一次 argv值减1,当argv便是1时遏制轮回,共轮回三次, 因此共可输出三个参数。在printf函数中,由于打印项*++argv是先加1再打印, 故第一次打印的是argv[1]所指的字符串BASIC。第二、 三次轮回别离打印后二个字符串。而参数e24是文件名,不必输出。
下例的呼吁行中有两个参数,第二个参数20即为输入的n值。在措施中*++argv的值为字符串“20”,然后用函数"atoi"把它换为整型作为while语句中的轮回节制变量,输出20个偶数。
#include"stdlib.h"
main(int argc,char*argv[]){
int a=0,n;
n=atoi(*++argv);
while(n–) printf("%d ",a++*2);
}
本措施是从0开始输出n个偶数。指向指针的指针变量假如一个指针变量存放的又是另一个指针变量的地点, 则称这个指针变量为指向指针的指针变量。
在前面已经先容过,通过指针会见变量称为间接会见, 简称间访。由于指针变量直接指向变量,所以称为单级间访。 而假如通过指向指针的指针变量来会见变量则组成了二级或多级间访。在C语言措施中,对间访的级数并未明晰限制, 可是间访级数太多时不容易领略解,也容易堕落,因此,一般很少高出二级间访。 指向指针的指针变量说明的一般形式为:
范例说明符** 指针变量名;
譬喻: int ** pp; 暗示pp是一个指针变量,它指向另一个指针变量, 而这个指针变量指向一个整型量。下面举一个例子来说明这种干系。
main(){
int x,*p,**pp;
x=10;
p=&x;
pp=&p;
printf("x=%d\n",**pp);
}
上例措施中p 是一个指针变量,指向整型量x;pp也是一个指针变量, 它指向指针变量p。通过pp变量会见x的写法是**pp。措施最后输出x的值为10。通过上例,读者可以进修指向指针的指针变量的说明和利用要领。
下述措施中首先界说说明白指针数组ps并作了初始化赋值。 又说明白pps是一个指向指针的指针变量。在5次轮回中, pps 别离取得了ps[0],ps[1],ps[2],ps[3],ps[4]的地点值(如图6.10所示)。再通过这些地点即可找到该字符串。
main(){
static char *ps[]={ "BASIC","DBASE","C","FORTRAN",
"PASCAL"};
char **pps;
int i;
for(i=0;i<5;i++){
pps=ps+i;
printf("%s\n",*pps);
}
}
本措施是用指向指针的指针变量编程,输出多个字符串。