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

本文介绍了C语言中的指针函数,包括其用法、错误示例及解决方案。接着讲解了函数指针的概念,如何声明、初始化和调用函数指针,并展示了使用函数指针数组的例子。最后,文章探讨了递归函数的工作原理,通过阶乘和斐波那契数列的例子阐述了递归的递推和回归阶段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}
  • 有三种改法:全局变量、静态变量、字符串常量
  1. 全局变量
#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;}
  1. 静态变量
#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;}
  1. 字符串常量
#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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值