文章目录
一、指针函数
指针函数是指一个函数的返回值为地址量的函数
指针函数的定义的一般形式如下
<数据类型> * <函数名称>(<参数说明>)
{
语句序列;
}
返回值:全局变量的地址/static变量的地址 /字符串常量的地址/堆的地址
下面程序是否有问题,若有问题,如何修改?
#include <stdio.h>
char * mystring( ) {
char str[20];
strcpy(str, “Hello”);
return str;
}
int main(void)
{
printf(“%s\n”, mystring());
return 0;
}
总结与思考
主要介绍了指针函数的概念以及指针函数的编写
思考
指针函数中可以返回什么样的指针?
编写一个指针函数,把整数123转化成字符串”123”。
二、递归函数和函数指针
递归函数-掌握
函数指针-掌握
递归函数:
递归函数是指一个函数的函数体中直接或间接调用了该函数自身
递归函数调用的执行过程分为两个阶段:
递推阶段:从原问题出发,按递归公式递推从未知到已知,最终达到递归终止条件
回归阶段:按递归终止条件求出结果,逆向逐步代入递归公式,回归到原问题求解
程序举例:
编写一个递归函数,计算n!
编写一个递归函数,计算斐波那契数列
一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?
我们不妨拿新出生的一对小兔子分析一下:
第一个月小兔子没有繁殖能力,所以还是一对
两个月后,生下一对小兔对数共有两对
三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对
函数指针:
函数指针用来存放函数的地址,这个地址是一个函数的入口地址
函数名代表了函数的入口地址
函数指针变量说明的一般形式如下
<数据类型> (*<函数指针名称>)(<参数说明列表>);
<数据类型>是函数指针所指向的函数的返回值类型
<参数说明列表>应该与函数指针所指向的函数的形参说明保持一致
(*<函数指针名称>)中,*说明为指针()不可缺省,表明为函数的指针
#include <stdio.h>
int add(int a, int b) {return a+b;}
int sub(int a, int b) {return a-b;}
int mul(int a, int b) { return a*b;}
int main(int argc, char *argv[])
{
int m = 10, n = 20;
int (* p)(int, int);//--函数指针
p = add;
//printf("%d\n", add(m, n));
printf("%d\n", (*p)(m, n));
p = sub;
printf("%d\n", (*p)(m, n));
return 0;
}
函数指针数组:
函数指针数组是一个保存若干个函数名的数组
一般形式如下
<数据类型> (*<函数指针数组名称> [<大小>] )(<参数说明列表> );
其中,<大小>是指函数指针数组元数的个数
其它同普通的函数指针
#include <stdio.h>
char * itoa(char *p, int n);
int main(int argc, char *argv[])
{
int n;
char s[50], * r;
printf("input:");
scanf("%d", &n);
r = itoa(s, n);
puts(r);
puts(s);
return 0;
}
char * itoa(char *p, int n)
{
int r, i = 0, j;
//static char p[50];
while (n) {
r = n % 10;
n /= 10;
p[i] = r + '0';
i++;
}
p[i] = '\0';
j = i-1;
i = 0;
while (i < j) {
r = p[i];
p[i] = p[j];
p[j] = r;
i++;
j--;
}
return p;
}
总结与思考
主要介绍了递归函数,函数指针以及函数指针数组的相关内容
思考
编写递归函数要注意什么问题?
调用C库中的qsort函数来实现整形数组的排序。