当前位置: 首页 > news >正文

华清远见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.整理思维导图

http://www.xdnf.cn/news/1321687.html

相关文章:

  • 当使用STL容器去存放数据时,是存放对象合适,还是存放对象指针(对象地址)合适?
  • 【C++】 using声明 与 using指示
  • Linux内存管理系统性总结
  • Orange的运维学习日记--45.Ansible进阶之文件部署
  • 获粤港澳大湾区碳足迹认证:遨游智能三防手机赋能绿色通信
  • LeetCode:无重复字符的最长子串
  • 实践笔记-VSCode与IDE同步问题解决指南;程序总是进入中断服务程序。
  • LAMP 架构部署:Linux+Apache+MariaDB+PHP
  • 规避(EDR)安全检测--避免二进制文件落地
  • 云计算- KubeVirt 实操指南:VM 创建 、存储挂载、快照、VMI全流程 | 容器到虚拟机(镜像转换/资源调度)
  • 前端处理导出PDF。Vue导出pdf
  • 王树森深度强化学习DRL(三)围棋AlphaGo+蒙特卡洛
  • STRIDE威胁模型
  • 新手向:Java方向讲解
  • Python实战--基于Django的企业资源管理系统
  • 块体不锈钢上的光栅耦合表面等离子体共振的复现
  • 后端通用基础代码
  • 在嵌入式单片机开发中,通过校验和或者校验码来比对程序版本好有何优劣势
  • 【OLAP】trino安装和基本使用
  • 【完整源码+数据集+部署教程】无人机目标检测系统源码和数据集:改进yolo11-efficientViT
  • Linux网络服务(一)——计算机网络参考模型与子网划分
  • Linux bash核心介绍及目录命令
  • Android中使用RxJava实现网络请求与缓存策略
  • Git-2025-0818
  • 数据结构:查找表
  • 开源im即时通讯软件开发社交系统全解析:安全可控、功能全面的社交解决方案
  • 从零到GPT:Transformer如何引领大模型时代
  • Nextcloud 私有云部署:cpolar 内网穿透服务实现安全远程文件访问
  • 4G高负荷解决方案
  • 《红色脉-络:一部PLMN在中国的演进史诗 (1G-6G)》 第6篇 | 专题:核心网的第一次革命——从电路交换到“用户/控制面分离”