1. 指针函数
- 用法:
数据类型 *函数名称(参数){
pass;
}
- 指针函数是指函数的返回值为地址量的函数
- 返回值:全局变量的地址、static变量的地址、字符串常量的地址、堆的地址
- 举个错误的例子,会报错
function returns address of local variable
#include <stdio.h>
#include <string.h>
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 <stdio.h>
#include <string.h>
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 <stdio.h>
#include <string.h>
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;}
- 字符串常量
#include <stdio.h>
char *getstring();
int main(int argc, char *argv[]){
printf("---%s---\n", getstring());
return 0;}
char *getstring(){
char *str = "hello";
return str;}
- 练习:编写一个指针函数,删除一个字符串中的空格
#include <stdio.h>
#include <string.h>
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= '\0';
return r;}
3. 函数指针
- 函数指针用来存放函数的地址,这个地址是函数的入口地址
- 函数名代表了函数的入口地址
- 用法:
数据类型 *函数指针名称(参数)
- 数据类型是函数指针所指向的函数的返回类型
- 参数列表和函数的形参保持一致
*函数指针名称
中的*
不可省略
- 举例
- 声明:
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)
#include <stdio.h>
#include <stdlib.h>
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);
}
4. 递归函数
-
递归函数指一个函数的函数体中直接或简介调用了该函数自身
-
递归函数的执行过程分为两个阶段
- 递推阶段:从原问题除法,按递归公式递推,从未知到已知,最终达到递归终止条件
- 回归阶段:按递归终止条件求出结果,逆向逐步代入递归公式,回归到原问题求解
-
举例:阶乘
#include <stdio.h>
int fac(int n);
int main(int argc, char *argv[]){
int n;
printf("input: ");
scanf("%d", &n);
printf("%d\n", fac(n));
return 0;
}
int fac(int n){
if (n==0||n==1)
return 1;
return n*fac(n-1);
}
- 举例:求斐波那契数列前十项
#include <stdio.h>
int 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);
}