第十一章对函数的进一步讨论 11传给mi函数的参数 以前main函数的一对圆括号是空的,即main() 但是可以通过运行C程序把参数传给C程序如下所示: main(int argc, char *argv) 其中argc和argv是两个参数,可由用户命名 arg必须是整型,argv是一个指向字符型的指针数组的指针
第十一章 对函数的进一步讨论 11.1 传给main函数的参数 以前main函数的一对圆括号是空的,即main( ) 但是可以通过运行C程序,把参数传给C程序如下所示: main(int argc, char **argv) {……………} 其中argc和argv是两个参数,可由用户命名. argc必须是整型, argv是一个指向字符型的指针数组的指针
11传给main函数的参数 第二个参数也可定义成char*argv 若我们对上述主函数进行编译连接,生成名为 myc. exe的可执行文 件,则当我们打入 myc OK! GOOD 其中OK!和GOOD称为命令行参数,argc的值为3
11.1传给main函数的参数 第二个参数也可定义成:char *argv[] 若我们对上述主函数进行编译连接,生成名为myc.exe的可执行文 件,则当我们打入: myc OK! GOOD 其中OK! 和 GOOD称为命令行参数,argc的值为3
argv的结构如下所示 ar myc OK!O GOOD\O
myc\0 OK!\0 GOOD\0 \0 argv的结构如下所示: argv
即:argv[0]argv[1]argV2]分别指向字符串myc,OK!GOOD 字符串agvo必不可少argc的值至少1,按规定 argvlargcl由 系统置“0 例如 main(int argc, char argyll int 1: printf( argc=%d\n,argc) for(i-l; i<argc; 1++) printf(%os”argv[i]) printf(n
即: argv[0],argv[1],argv[2]分别指向字符串myc,OK!,GOOD 字符串argv[0]必不可少,argc的值至少1,按规定argv[argc]由 系统置‘\0’. 例如: main(int argc,char *argv[]) {int i; printf(“argc=%d\n”,argc); for(i=1;i<argc;i++) printf(“%s ”,argv[i]); printf(“\n”); }
若在命令行中打入: myc A COMMAND LINE 程序将输出:?? 22通过实参向函数传递函数名或指向函数 的指针变量
若在命令行中打入:myc A COMMAND LINE 程序将输出:?? 2.2 通过实参向函数传递函数名或指向函数 的指针变量
1指向函数的指针变量的定义 在C语言中函数名代表该函数的入口地址,可以 定义一种指向函数的指针来存放这个地址。 d ouble fun(int a int* p) maino fdouble(fp(int, int ),y; int n fp=fun y=(*fp)(S6,&n)
1.指向函数的指针变量的定义 在C语言中函数名代表该函数的入口地址,可以 定义一种指向函数的指针来存放这个地址。 double fun(int a,int *p) {……} main() {double (*fp)(int,int*),y; int n; fp=fun; ……. y=(*fp)(56,&n); …….}
其中,说明符(*fp) (int, int*)说明印是一个指 向函数的指针变量 若写成*fp(int;int*),说明不是指针变量, 而是说明印是一个函数,该函数的返回值的 类型是基类型为 double的指针类型 语句fp-fiun把fun函数的地址赋给指针变量印, 语句y=(*fp)(56,&n),实现对函数的调用
其中,说明符(*fp)(int,int*)说明fp是一个指 向函数的指针变量 若写成*fp(int,int*), 说明fp不是指针变量, 而是说明fp是一个函数,该函数的返回值的 类型是基类型为double的指针类型 语句fp=fun把fun函数的地址赋给指针变量fp, 语句y=(*fp)(56,&n),实现对函数的调用
2函数名或指向函数的指针作为实参 函数名或指向函数的指针可作为实参传给函数,当然, 对应的形参必须是类型相同的指针变量。 见书pl61的例112 113函数的递归调用 递归调用:直接或间接的调用自己 二个条件: 可以把要解的问题转化为新的问题,解法与原来的相同, 而对象有规律地递增或递减 必定要有一个明确的结束递归的条件
11.3 函数的递归调用 递归调用:直接或间接的调用自己 二个条件: •可以把要解的问题转化为新的问题,解法与原来的相同, 而对象有规律地递增或递减。 •必定要有一个明确的结束递归的条件。 2.函数名或指向函数的指针作为实参 函数名或指向函数的指针可作为实参传给函数,当然, 对应的形参必须是类型相同的指针变量。 见书p161的例11.2
例113用递归的方法求n(书p162) 求n!可以用以下数学关系表示 当n=0时 n(n-1)!当n>0时 也即求n的问题可以转化为求n(n-1)!的新问题而 求(n-1)的解法与求n!的解法完全相同
例11.3 用递归的方法求n!(书p162) 求n!可以用以下数学关系表示: n!= 1 当 n =0 时 n.(n-1)! 当 n >0 时 也即:求n!的问题可以转化为求n.(n-1)! 的新问题,而 求(n-1)! 的解法与求n!的解法完全相同
fac(int n) Int t; if(==1n==0) return 1 it=n*fac(n-1); return t mal i int my printf(" enter m:
fac (int n) { int t; if (n==1||n==0) return 1; else {t=n*fac(n-1); return t; } } main() { int m,y; printf(“enter m:”);