- 用法:
数据类型 *函数名称(参数){
pass;
}
- 指针函数是指函数的返回值为地址量的函数
- 返回值:全局变量的地址、static变量的地址、字符串常量的地址、堆的地址
- 举个错误的例子,会报错function returns address of local variable
#include#include char *getstring(); int main(int argc, char *argv[]) { printf("---%s---n", getstring()); //会返回乱码, return 0; } char *getstring() { char str[20]; strcpy(str, "Hello"); return str; }
- 有三种改法:全局变量、静态变量、字符串常量
- 全局变量
#include#include char str[20]; char *getstring(); int main(int argc, char *argv[]){ printf("---%s---n", getstring()); return 0;} char *getstring(){ strcpy(str, "Hello"); return str;}
- 静态变量
#include#include char *getstring(); int main(int argc, char *argv[]){ printf("---%s---n", getstring()); return 0;} char *getstring(){ static char str[20]; strcpy(str, "Hello"); return str;}
- 字符串常量
#includechar *getstring(); int main(int argc, char *argv[]){ printf("---%s---n", getstring()); return 0;} char *getstring(){ char *str = "hello"; return str;}
- 练习:编写一个指针函数,删除一个字符串中的空格
#include3. 函数指针#include char *del_space(); int main(int argc, char *argv[]){ char *r; char str[] = " Hello World "; r = del_space(str); printf("---%s---n", r); puts(str); return 0;} char *del_space(char *s) //char *s{ char *r =s; char *p = s; while(*s){ if (*s==' ') s++; else{ *p = *s; s++; p++;}} *p= ' '; return r;}
- 函数指针用来存放函数的地址,这个地址是函数的入口地址
- 函数名代表了函数的入口地址
- 用法:数据类型 *函数指针名称(参数)
- 数据类型是函数指针所指向的函数的返回类型
- 参数列表和函数的形参保持一致
- *函数指针名称中的*不可省略
- 举例
- 声明:int (*p_add) (int a, int b);或int (*p_add)(int, int)
- 初始化:p_add=add;
- 调用:(*p)(a, b)
- 举例
- 可以用称指针数组:*(p[2])(int, int)={add, sub};
- 调用快排(qsort)
#include4. 递归函数#include int compare(const void *, const void *); int main(int argc, char *argv[]){ int a[] = {1, 9, 8, 2, 3, 7, 4, 6, 5}, n, i; n = sizeof(a)/sizeof(int); qsort(a, n, sizeof(int), compare); for (i = 0; i < n; i++){ printf("%d", a[i]); } puts(""); return 0; } int compare(const void *p, const void *q){ return (*(int *)p - *(int *)q); }
-
递归函数指一个函数的函数体中直接或简介调用了该函数自身
-
递归函数的执行过程分为两个阶段
- 递推阶段:从原问题除法,按递归公式递推,从未知到已知,最终达到递归终止条件
- 回归阶段:按递归终止条件求出结果,逆向逐步代入递归公式,回归到原问题求解
-
举例:阶乘
#includeint fac(int n); int main(int argc, char *argv[]){ int n; printf("input: "); scanf("%d", &n); printf("%dn", fac(n)); return 0; } int fac(int n){ if (n==0||n==1) return 1; return n*fac(n-1); }
- 举例:求斐波那契数列前十项
#includeint fib(int n); int main(int argc, char *argv[]){ int n = 1; for (int i=0; i<10; i++){ printf("%d ", fib(n)); n++; } puts(""); return 0; } int fib(int n){ if (n == 1 || n == 2) return 1; else return fib(n-1)+fib(n-2); }



