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

C语言-函数-1

以下是我初学C语言的笔记记录,欢迎在评论区留言补充

一,函数分为几类

* 函数分为两类:

一类是库函数;一类是自定义函数

*  库函数:

系统自己带的,在使用时候,要用到头文件;

查询库函数工具:

cppreference.com

* 自定义函数:

(1)需要包括类型,函数名,主体(表示式);

(2)如果要是自定义这个函数不需要返回值,就定义" void " 类型

图一

# include <stdio.h>void S(int a) // 类型	函数名(形参)
{printf("用的是void,不用返回值");
} //主体(表达式)
int main()
{int a = 1;S(a); //调用自定义函数return 0;
}

图二

//不是void,这里用的是int
#include<stdio.h>
int Add(int x, int y) //返回值类型为整数,函数名(形参)
{int z = 0;z = x + y;return z;
} //主体(表达式)
int main()
{int a = 0;int b = 0;int c = 0;scanf("%d %d", &a, &b);c = Add(a, b); //调用自定义函数printf("c等于%d", c);return 0;
}

二,函数的参数

* 分类:

实参和形参

* 实参:

(1)比如图二main函数中【c = Add(a,b)】内的a,b;

(2)实参是main函数中调用自定义函数中的参数,可以是常量,变量或是表达式【c = Add(a+3,b)】,函数【c = Add(Add(3,5),b)】;

(3)实参是要有一个真实且准确的结果传给形参即可;

(4)实参的作用域或是生命周长:我个人的理解是main函数什么时候结果,它的生命或是作用域也就结束了

* 形参:

(1)比如图二自定义函数中【Add(int x, int y)】内的 x ,y;

(2)形参是在自定义括号内,当main中调用后,就会被销毁,即只有在函数中形参有效;在函数调用的时候,才会被分配内存单元;

(3)形参的作用域或是生命周长:当main函数调用自定义函数开始,到自定义函数完成了所有表达式,就会被销毁

举例:

大概可以理解为黄色部分为实参的作用域,它跟随着main函数;绿色部分为形参的作用域,它开始的条件是黄色部分要调用自定义函数

* 实参和形参的联系

其实两者的关系,和调用方式有着很大联系;

其次,形参实例化【实例化,就是给参数分配内存单元了】是实参的一份临时拷贝,通常情况下,修改形参的数值是无法改变到实参的身上,但是也有例外,比如当进行传址调用时

三,函数的调用

* 调用方式:

一种是传值调用,一种是传址调用

* 传值调用:

把实参的值复制给形参,自定义函数内对形参的修改不影响实参

* 传址调用:

将实参地址传给形参,自定义函数对形参的修改会影响到实参

【我个人对两种调用的理解,前者:实参的值复制给形参的时候,形参开始被创建,意味着它也有内存单元了,即它有了存放这个值的地址了,但是实参和形参的地址是相互独立的,即使两者存放的值是一样的,但是彼此位置唯一且不同,所以形参的修改不影响实参;后者:因为实参是将自己的地址传给了形参,即形参此时是一个指针变量,用来存放地址,那么如果想要形参的修改影响到实参,那么在自定义函数中的表达式,要用到解引用操作符,这样相当于是地址唯一,通过定位进行修改,就可以改变实参值,此时的修改就起到了作用】

 形参的指针变量存着是实参的地址


//效果:将a,b两个值互换# include<stdio.h>
void Xf(int* x, int* y)//用指针变量存放a,b的地址
{int z = 0; //作用是临时存放其中一个变量z = *x;//解引用操作符,此时*x就是a*x = *y;//这句话意思是 a = b,b赋值给a*y = z; // b = z,z赋值给b//注意在这个表达式中,如果没有解引用操作符,//将形参中的地址翻译成对应的变量,那么无法成功互换数值
}
int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);printf("换位置前a=%d,b=%d", a, b);Xf(&a, &b);//取a,b的地址printf("\n换位置后a=%d,b=%d", a, b);return 0;
}

【琐碎记录】

一个工程里,可以有多个.c,但是只能有一个main函数 

相关文章:

  • 【刷题】第三弹——二叉树篇(上)
  • 【C++ 真题】P3456 [POI2007] GRZ-Ridges and Valleys
  • AI大模型从0到1记录学习 数据结构和算法 day20
  • 【Linux】网络基础和socket(4)
  • SQL进阶知识:六、动态SQL
  • 济南国网数字化培训班学习笔记-第二组-5节-输电线路设计
  • 解决 PostgreSQL 检查约束导致的数据插入异常问题
  • 网络IP冲突的成因与解决方案
  • 三维重建模块VR,3DCursor,MPR与VR的坐标转换
  • 二叉树的创建,增加,前序遍历
  • Bytebase 取得 SOC 2 Type 1 认证
  • 第55讲:农业人工智能的跨学科融合与社会影响——构建更加可持续、包容的农业社会
  • YOLOv5改进(十)-- 轻量化模型MobileNetv4
  • Sharding-JDBC 系列专题 - 第十篇:ShardingSphere 生态与未来趋势
  • PHYBench:首个大规模物理场景下的复杂推理能力评估基准
  • C++23文本编码革新:迈向更现代的字符处理
  • 2025年3月电子学会青少年机器人技术(五级)等级考试试卷-理论综合
  • 10.接口而非实现编程
  • CentOS 7上Memcached的安装、配置及高可用架构搭建
  • LLM学习笔记4——本地部署Docker、vLLM和Qwen2.5-32B-Instruct实现OpenManus的使用
  • 山西10岁男孩遭生母和继父殴打遇害,案件庭审延期
  • 牧原股份一季度归母净利润44.91亿元,同比扭亏为盈
  • 我国成年国民综合阅读率82.1%,数字化阅读接触率首超80%
  • 出35万元为副县长的女友凑购房首付,青海一商人被判缓刑
  • 灰鹦鹉爆粗口三年未改?云南野生动物园:在持续引导
  • 十三届全国政协经济委员会副主任张效廉严重违纪违法被开除党籍