C语言学习(3)—— 函数

C语言不支持函数重载 

一、函数的使用方法

1. 直接使用

(1)定义的函数在main函数 之上

#include<stdio.h>  int sum(int num1, int num2){int res = 0;res = num1 + num2;return res;
}int main(){int res = sum(2, 3);printf("%d", res);return 0;
}

(2) 定义的函数在main函数之下

#include<stdio.h>  int sum(int num1, int num2);int main(){int res = sum(2, 3);printf("%d", res);return 0;
}int sum(int num1, int num2){int res = 0;res = num1 + num2;return res;
}

2. 头文件

(1)头文件是扩展名为 .h 的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享;(2)头文件只能声明函数,不能定义函数;(3)头文件名和源文件名保持一致;(4)C语言中include<> 引用的是编译器的类库路径里的头文件,用于引用系统头文件,include " " 引用的是程序目录的相对路径中的头文件,如果在程序目录没有找到引用的头文件则到编译器的类库路径的目录下找该头文件,找不到则报错,用于引用用户头文件;(5)建议把所有的常量、系统全局变量和函数原型写在头文件中,在需要的时候随时引用这些头文件;(6)一个 .h 对应的 .c 文件中又可以引用其他 .h 文件。

使用示例:

① 创建一个自定义函数的头文件 function.h

int sum(int num1, int num2);

② 创建自定义函数头文件 function.h 所对应的 C文件 function.c

int sum(int num1, int num2){int res = 0;res = num1 + num2;return res;
}

③ 在调用自定义函数的主文件 master.c 中引入头文件

#include<stdio.h>  
#include "function.h"   // 引入头文件int main(){int res = sum(2, 3);printf("%d", res);return 0;
}

注意:由于引入了自定义函数的头文件,在运行时需要链接到该头文件对应的C文件才能成功调用到该函数,命令为:gcc master.c function.c -o master.exe

二、函数调用

函数调用的规则:(1)当调用(执行)一个函数时,就会开辟一个独立的空间(栈);(2)每个栈空间是相互独立;(3)函数栈中的内容都会被完整的执行;(4)当调用的函数栈全部执行完毕后,栈空间销毁,会返回到调用该函数的位置,继续往后执行 

// 例子一:最终输出是:2   3   4
#include<stdio.h>  void test(int num){if(num > 2){test(num - 1);}printf("%d  ", num);   
}int main(){test(4);return 0;
}
// 例子二:最终输出是:2
#include<stdio.h>  void test(int num){if(num > 2){test(num - 1);}else{printf("%d  ", num);   }}int main(){test(4);return 0;
}

 三、函数变量传递

1. 值传递

#include<stdio.h>  void add(int num){num++;
}int main(){int n = 3;add(n);printf("n = %d", n);   // n = 3return 0;
}

2. 指针地址传递

#include<stdio.h>  void add(int *num){   // *num = &n :num 等于变量 n 的地址(*num)++;         //             *num 指向变量 n 的值
}int main(){int n = 3;add(&n);printf("n = %d", n);   // n = 4return 0;
}
#include<stdio.h>  void swap(int *num1, int *num2){int temp = *num1;     // 将num1这个指针指向的变量的值赋值给temp*num1 = *num2;        // 将num2这个指针指向的变量的值赋值给num1这个指针指向的变量*num2 = temp;         // 将temp的值赋值给num2这个指针指向的变量
}int main(){int n1 = 2;int n2 = 3;swap(&n1, &n2);printf("n1 = %d,  n2 = %d", n1, n2);   // n1 = 3,  n2 = 2return 0;
}

四、全局变量和局部变量

局部变量:(1)局部变量存放在中,函数被调用时才动态地为变量分配存储单元,它的作用域仅限于函数内,局部变量如果初始化时不赋值则没有默认值;(2)局部变量被 static 修饰后,称为静态局部变量,静态局部变量存放在静态存储区(全局性质的区域),如果初始化时不赋值会默认值,静态局部变量只会被初始化一次

#include<stdio.h>  void test1(void){int num = 1;num++;printf("num = %d \n", num);
}void test2(void){static int num = 1;num++;printf("num = %d \n", num);
}int main(){test1();    // num = 2test1();    // num = 2test2();    // num = 2test2();    // num = 3return 0;
}

全局变量:(1)全局变量和静态变量存放在静态存储区,它的作用域默认是整个程序,全局变量如果初始化时不赋值,有默认值

malloc动态分配的数据存放在堆中

五、常用的系统函数

1. 字符串函数

引入头文件 <string.h>

#include<stdio.h>  
#include<string.h>int main(){char temp[100];   // 定义字符数组char dest[100] = "ABC";// strlen(): 统计字符串的大小char *str = "123";printf("字符串str的长度 = %d \n", strlen(str));    // 字符串str的长度 = 3// strcopy: 字符串拷贝strcpy(temp, str);          // 将str拷贝到temp中printf("%s \n", temp);      // 123strcpy(dest, str);          // 将str拷贝到dest中,会覆盖原本的值printf("%s \n", dest);      // 123 // strcat: 字符串连接strcat(temp, str);          // 将str追加到temp中printf("%s \n", temp);      // 123123strcat(temp, dest);        // 将dest追加到temp中printf("%s \n", temp);     // 123123123return 0;
}

2. 时间函数

引入头文件 <time.h>

#include<stdio.h>  
#include<time.h>void test(void){int sum = 0;for(int i = 0; i < 1000000000; i++){sum += i;}
}int main(){//char *ctime(const time_t *timer):获取当前时间time_t curtime;time(&curtime);   // time()进行初始化printf("当前时间:%s \n", ctime(&curtime));// double difftime(time_t time1, time_t time2):返回time1和time2之间的差,用于统计某段代码的执行时间(秒)time_t start, end;double test_time;time(&start);   // 初始化得到此时的时间test();         // 执行time(&end);     // 初始化得到此时的时间test_time = difftime(end, start);printf("执行时间:%lf \n", test_time);return 0;
}

3. 数学函数

引入头文件 <math.h>

#include<stdio.h>  
#include<math.h>int main(){// double exp(double x) : e 的 x 次幂// double log(double x) :x 以 e 为底的对数// double pow(double x, double y) :x 的 y 次幂// double sqrt(double x) :x 的平方根// double fabs(double x) :x 的绝对值return 0;
}

4. 基本数据类型和字符串转换

(1)基本数据类型 转 字符串

引入头文件 <stdio.h>

#include<stdio.h>  // 基本数据类型 转 字符串类型 :sprintf
int main(){char str1[100];char str2[100];char str3[100];int a = 1234;double b = 3.1415;sprintf(str1, "%d", a);sprintf(str2, "%lf", b);        // 默认是6位小数sprintf(str3, "%d %lf", a, b);printf("str1 = %s,  str2 = %s,  str3 = %s", str1, str2, str3);   // str1 = 1234,  str2 = 3.141500,  str3 = 1234 3.141500return 0;
}

(2)字符串 转 基本数据类型

引入头文件 <stdlib.h>

#include<stdio.h>  
#include<stdlib.h>// 基本数据类型 转 字符串类型 :sprintf
int main(){char str1[10] = "12345";char str2[10] = "3.1415";char str3[10] = "A";int a = atoi(str1);short b = atoi(str1);long c = atol(str1);double d = atof(str2);char e = str3[0];printf("a = %d, b = %d, c = %ld, d = %f, e = %c", a, b, c, d, e);   // a = 12345, b = 12345, c = 12345, d = 3.141500, e = Areturn 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/642016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据学习之Flink、搞懂Flink的恢复策略

第一章、Flink的容错机制 第二章、Flink核心组件和工作原理 第三章、Flink的恢复策略 第四章、Flink容错机制的注意事项 第五章、Flink的容错机制与其他框架的容错机制相比较 目录 第三章、Flink的恢复策略 Ⅰ、恢复策略 1. Checkpoint&#xff1a; 2. Savepoint&#…

Sentinel降级操作

1.通过对feign调用的降级 如果访问失败&#xff0c;则返回另外的信息 正常的feign调用 FeignClient(value "gulimall-seckill",fallback SeckillFeignServiceFallback.class) public interface SeckillFeignService {/*** 写给商品服务的接口&#xff0c;查询秒杀…

2024茶饮品牌如何出圈,媒介盒子分析

随着新式茶饮的消费场景更加多元化&#xff0c;品类不断拓宽&#xff0c;消费者对新式茶饮的热情也是只增不减。居民可支配收入水平不断上升&#xff0c;居民消费升级为新式茶饮的发展也提供了良好基础&#xff0c;今天媒介盒子就来和大家聊聊&#xff1a;2024茶饮品牌如何出圈…

win10系统 pdf 文件无法正常预览

网上也看了不少办法&#xff0c;修改注册表什么的&#xff0c;太麻烦了&#xff0c;尝试了一下下载Adobe Acrobat Reader&#xff0c;安装后就可以成功预览显示啦&#xff01;对&#xff0c;就是这么简单&#xff01;Adobe Acrobat Reader下载链接&#xff1a;link

随机森林中每个树模型分裂时的特征选取方式

随机森林中每个树模型分裂时的特征选取方式 随机森林中每个树模型的每次分裂都是基于随机选取的特征子集进行分裂的。 具体来说&#xff0c;对于每个决策树&#xff0c;在每个节点的分裂过程中&#xff0c;随机森林算法会从原始特征集合中随机选择一个特征子集&#xff0c;然…

vulhub之Zabbix篇

CVE-2016-10134--SQL注入 一、漏洞介绍 zabbix是一款服务器监控软件&#xff0c;其由server、agent、web等模块组成&#xff0c;其中web模块由PHP编写&#xff0c;用来显示数据库中的结果。 漏洞环境 在vulhub靶场进行复现&#xff0c;启动zabbix 3.0.3。 二、复现步骤 1…

[代码随想录2]51单片机1T/12T到底怎么选?

为什么说51单片机怎么选&#xff1f; 时至今日&#xff0c;44年来51单片机自强不息&#xff0c;怎么描述它&#xff0c;堪称控制芯片中的王者&#xff01;&#xff01;&#xff01; 假设你21岁大学毕业进入社会&#xff0c;交社保交到今天恭喜你成功退休了214465 传统即标准5…

搭建一个简单的Spring Demo

要学习Spring 源码&#xff0c;一个是从Spring GitHub 上去down源码&#xff0c;然后倒入IDEA编译&#xff0c;但这种方法费时费力&#xff0c;如果你不需要对Spring 源码进行修改后&#xff0c;再编译的话&#xff0c;直接搭建一个Spring Demo 的Maven项目&#xff0c;引入Spr…

代理设计模式JDK动态代理CGLIB动态代理原理

代理设计模式 代理模式&#xff08;Proxy&#xff09;&#xff0c;为其它对象提供一种代理以控制对这个对象的访问。如下图 从上面的类图可以看出&#xff0c;通过代理模式&#xff0c;客户端访问接口时的实例实际上是Proxy对象&#xff0c;Proxy对象持有RealSubject的引用&am…

使用DockerFile构建镜像与镜像上传

目录 前言&#xff1a;为什么要使用Dockerfile &#xff1f; DockerFile构建镜像 1、构建基础对象 2、Dockerfile文件结构 3、构建Dockerfile文件镜像 二、镜像上传&#xff08;阿里云&#xff09; 前言&#xff1a;为什么要使用Dockerfile &#xff1f; 首先Dockerfile …

IOS-生命周期-Swift

目录 App生命周期应用状态未运行——Not running未激活——Inactive激活——Active后台——Backgroud挂起——Suspended 关系图生命周期方法相关方法注意在其他地方监听 ViewController生命周期UIView生命周期 App生命周期 应用状态 App主要有五种状态&#xff0c;分别是&…

Axure RP 9 动态面板

目录 轮播图绘制 多种方式登录 前言: 轮播图绘制、多种方式登录界面绘制 轮播图绘制 首先绘制一个动态面板 在概要区域选中动态面板进入State1面板中插入图片绘制 双击图片绘制插入本地图片&#xff0c;右键State1重复状态并更改图片 点击交互面板新建交互将需要添加…

RuoYi-Cloud本地部署--详细教程

文章目录 1、gitee项目地址2、RuoYi-Cloud架构3、本地部署3.1 下载项目3.2 idea打开项目3.3 启动nacos3.4 若依数据库准备3.5 启动redis3.6 修改nacos中的各个模块的配置文件3.7 启动ruoyi前端项目3.8 启动各个微服务模块 4、启动成功 1、gitee项目地址 https://gitee.com/y_p…

http网络编程——在ue5中实现文件传输功能

http网络编程在ue5中实现 需求&#xff1a;在unreal中实现下载功能&#xff0c;输入相关url网址&#xff0c;本地文件夹存入相应文件。 一、代码示例 1.Build.cs需要新增Http模块&#xff0c;样例如下。 PublicDependencyModuleNames.AddRange(new string[] { "Core&q…

Whatsapp 相关

Whatsapp 相关 本篇文章主要记录下whatsapp 的一些文件信息的存储路径. 1: 应用包名 whatsapp的包名如下: com.whatsapp 2: 注册信息 whatsapp的注册信息存储路径如下: /data/data/com.whatsapp/shared_prefs/registration.RegisterPhone.xml内容如下: <?xml versio…

Android:RecyclerView自由拖动item

原生就自带有可拖动item的工具&#xff1a;ItemTouchHelper 看下效果&#xff1a; 可拖动RecyclerView预览效果 接下来我们看如何使用。 1、自定义ItemTouchHelper的callback&#xff0c;用来限制是否可以拖动&#xff0c;以及拖动之后的位置更新&#xff1a; 其中判断条件中…

python的__doc__

直接问GPT的回答如下&#xff0c;但是提供的例子不够好。 __doc__ 是 Python 中用于保存对象&#xff08;模块、类、函数等&#xff09;文档字符串的特殊属性。 文档字符串&#xff08;docstring&#xff09;是编写在代码中用于文档自述的字符串。它通常用于提供关于代码目的…

python常见函数-笔记

lambda函数用法 匿名函数lambda&#xff1a;是指一类无需定义标识符&#xff08;函数名&#xff09;的函数或子程序。 所谓匿名函数&#xff0c;通俗地说就是没有名字的函数&#xff0c;lambda函数没有名字&#xff0c;是一种简单的、在同一行中定义函数的方法。 lambda函数一…

锂电池SOC估计 | PatchTST时间序列模型锂电池SOC估计

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池SOC估计 | PatchTST时间序列模型锂电池SOC估计 采用新型PatchTST时间序列模型预测锂电池SOC&#xff0c;送锂电池数据集 可替换数据集&#xff0c;实现负荷预测、流量预测、降雨量预测、空气质量预测等其他多种…

k8s之ingress

ingress基于域名进行映射&#xff0c;把url(http https)的请求转发到service&#xff0c;再由service把请求转发到每一个pod ingress只要一个或者少量的公网ip或者LB&#xff0c;可以把多个http请求暴露到外网&#xff0c;七层反向代理 理解为service的service&#xff0c;是…