华清远见25072班C语言学习day11

重点内容:

函数:

定义:

返回值类型 函数名(参数列表) { //函数体 }

函数的参数列表中可以有多个数据

返回值:如果函数没有返回值可以写成void 返回值的作用,函数的结果用来返回给主调函数的,如果主调函数处不需要函数的结果,函数可以没有返回值

参数:如果函数实现功能时,需要外部传递数据过来,那么函数就需要参数

写在函数定义位置的参数叫做形式参数,没有实际的意义,只起到占位作用

函数的定义不能嵌套

函数的分类:

是否需要自己定义:库函数、自定义函数

是否被调用的角度:主调函数、被调函数

是否有返回值和参数的角度:

1.有参有返回值

2.有参无返回值

3.无参无返回值

4.无参有返回值

函数的调用:

函数名(实际参数);

实际参数的个数需要和形式参数的个数保持一致

函数调用的过程就是实参初始化形参的过程

函数定义的代码不会执行,只有函数被调用时才会执行函数体

不同函数中的同名变量,互不相关

函数的返回值:

函数的返回值可以理解为函数调用的结果

函数声明:

函数定义在函数调用下方时,需要函数声明

格式: 返回值类型 函数名(参数类型);

作用: 告诉编译器,函数的参数类型和返回值类型,让编译器可以找到该函数

数组作为函数参数传递:

所有出现在函数形参位置长得像数组定义的代码,实际上都是指针

void fun(int *p,int len) //一维整形数组:形参需要使用同类型的指针变量接收一维整形数组的地址,还需要传一维整型数组的长度(因为在功能函数中不能求出数组的长度)

void fun(char *p)//一维字符数组:只需要接收一维字符数组的首地址即可,不需要接收长度

void fun(int (*p)[3],int r,int c)//二维数组作为函数参数传递时,形参需要使用数组指针接收

指针函数:

全局变量和局部变量:

全局变量:不定义在任何括号中的变量,生命周期和作用域是程序的开始到结束

局部变量:定义在括号中的变量,生命周期和作用域是括号的开始到结束

如何区分生命周期和作用域:

生命周期:内存存在的时候

作用域:可以访问的位置

static的使用:

static用于局部变量:延长局部变量的生命周期,编程程序的开始到结束

static修饰全局变量:不能在其他文件中访问该全局变量

static修饰函数:不能在其他文件中调用函数

指针函数:

本质是一个函数,返回值是指针(一定是一个有返回值的函数)

返回值是函数返回到主调函数处的结果

总结:指针函数可以返回生命周期更长的变量的地址

动态内存分配:

申请堆区内存

malloc:

void *malloc(size_t size);

功能:从堆区申请指定字节数的空间

返回值:申请的堆区空间的首地址

参数:申请多少个Byte

free:

void free(void *ptr);

功能:释放堆区内存

返回值:无

参数:万能指针,接收任意类型的地址(要释放空间的首地址)

内存泄漏:

堆区有空间没有在使用,但是空间所有权没有还给内存,导致无法从堆区申请空间,这种情况叫内存泄漏

如何避免内存泄漏,申请空间之后记得释放

函数指针:

本质是一个指针,指向一个函数

int add(int a,int b) { return a+b; } -->int (*p)(int,int) = add;//返回值类型 (*函数指针名)(形参类型); 让指针指向指定返回值类型和参数类型的函数

回调函数:

函数的其中一个参数是函数指针,由函数指针指向的函数来完成实际的功能

递归函数:

递归的三要素:

递归出口(没有就是死递归)

递归逻辑

递归返回值


作业:

1.赶鸭子问题:一个人赶着鸭子去村庄卖,每经过一个村子卖出一半又一只,经过七个村庄后还剩下两只鸭子,问出发时共赶了多少只鸭子

程序源码:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

int duck(int day)

{

if(day==7)return 2;

return(duck(day+1)+1)*2;

}

int main(int argc, const char *argv[])

{

printf("%d\n",duck(0));

return 0;

}

2.用递归输出数的二进制

程序源码:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

int transform(int num)

{

if(num>1)

{

transform(num/2);

}

printf("%d",num%2);

}

int main(int argc, const char *argv[])

{

int num;

printf("请输入需要转换的数:");

scanf("%d",&num);

printf("after transform:");

transform(num);

putchar(10);

return 0;

}

3.递归输出斐波那契数列

程序源码:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

int Fibonacci(int num)

{

if(num==1||num==2)

{

return 1;

}

return Fibonacci(num-1)+Fibonacci(num-2);

}

int main(int argc, const char *argv[])

{

int num;

printf("请输入打印包含几个元素的斐波那契数列:");

scanf("%d",&num);

printf("Fibonacci=");

for(int i=1;i<=num;i++)

{

printf("%d\t",Fibonacci(i));

}

putchar(10);

return 0;

}

4.整理思维导图

相关推荐
西工程小巴1 小时前
实践笔记-VSCode与IDE同步问题解决指南;程序总是进入中断服务程序。
c语言·算法·嵌入式
Despacito0o4 小时前
C语言基础:变量与进制详解
java·c语言·开发语言
科大饭桶5 小时前
C++入门自学Day11-- String, Vector, List 复习
c语言·开发语言·数据结构·c++·容器
Felven5 小时前
C. Game of Mathletes
c语言·开发语言
Cx330❀7 小时前
【数据结构初阶】--排序(四):归并排序
c语言·开发语言·数据结构·算法·排序算法
意疏7 小时前
【C语言篇】srand函数的详细用法解析
c语言·开发语言
艾莉丝努力练剑8 小时前
【C语言16天强化训练】从基础入门到进阶:Day 1
c语言·开发语言·数据结构·学习
AI+程序员在路上8 小时前
单片机驱动LCD显示模块LM6029BCW
c语言·单片机·嵌入式硬件
·白小白8 小时前
力扣(LeetCode) ——100. 相同的树(C语言)
c语言·算法·leetcode