栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言-指针函数、函数指针和递归函数-学习笔记10

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言-指针函数、函数指针和递归函数-学习笔记10

1. 指针函数
  • 用法:
数据类型 *函数名称(参数){
	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;
}
  • 有三种改法:全局变量、静态变量、字符串常量
  1. 全局变量
#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;}
  1. 静态变量
#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;}
  1. 字符串常量
#include 

char *getstring();

int main(int argc, char *argv[]){
	printf("---%s---n", getstring());
	return 0;}

char *getstring(){
	char  *str = "hello";
	return str;}
  • 练习:编写一个指针函数,删除一个字符串中的空格
#include 
#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;}
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 
#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);
}
4. 递归函数
  • 递归函数指一个函数的函数体中直接或简介调用了该函数自身

  • 递归函数的执行过程分为两个阶段

    • 递推阶段:从原问题除法,按递归公式递推,从未知到已知,最终达到递归终止条件
    • 回归阶段:按递归终止条件求出结果,逆向逐步代入递归公式,回归到原问题求解
  • 举例:阶乘

#include 

int 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);
}
  • 举例:求斐波那契数列前十项
#include 

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);
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/925568.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号