当前位置:网站首页>c语言---18 函数(自定义函数)
c语言---18 函数(自定义函数)
2022-06-24 13:02:00 【要努力丫!】
在这篇记录之前,首先要说明一点,那就是主函数也是函数。
1、自定义函数的组成
在之前学习了一下库函数,了解到了库函数是包含函数的返回类型、函数名以及函数参数的。举个例子(还是用之前的例子来说),数组内容的拷贝,代码如下所示:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = {
0 };
char arr2[] = "abc";
strcpy(arr1,arr2);
printf("%s\n",arr1);
return 0;
}
这段代码是要通过库函数strcpy实现将数组2中的内容拷贝给数组1,在使用库函数之前,需要查询一下库函数的使用所需要包含的头文件。
strcpy库函数的格式:char *strcpy(char *strDestination,const char *strSource)
其中,strcpy是函数名;(char *strDestination,const char *strSource)是函数参数;char *是函数的返回类型。自定义函数和库函数一样,有函数名、返回值类型以及函数参数。但是不一样的是这些都是我们自己来设计的,就会给我们很大的发挥空间,正所谓“一千个人眼里有一千个哈姆雷特”,每个人也会有每个人的写代码风格。
自定义函数的组成:
ret_type fun_name(para1, *)
{
statement;//语句项
}
ret_type 返回类型
fun_name 函数名
para1 函数参数
{
}里面的是结构体
2、自定义函数的示例
示例一:写一个函数可以找出两个整数中的最大值
函数的定义
int get_max(int x, int y)
{
int z = 0;
if (x > y)
z = x;
else
z = y;
return z;//返回z--返回两者中的较大值,z的类型是整型,所以get_max的类型也是整型
}
int main()
{
int a = 10;
int b = 20;
//函数的调用
int max = get_max(a,b);
printf("max = %d\n",max);
return 0;
}
运行结果如下:
max = 20
示例二:写一个函数可以交换两个整型变量的内容
代码如下:
void Swap(int x, int y)
//只需要将a以及b的值交换一下就可以,并不需要返回一个什么值
//有些函数当完成事情之后,什么都不需要返回,就将函数的返回类型写成void
//函数返回类型的地方写为void,表示这个函数不返回任何值,也不需要返回
{
int tmp = 0;
tmp = x;
x = y;
y = tmp;
}
int main()
{
int a = 10;
int b = 20;
//写一个函数,交换两个整型变量的值
printf("交换前:a=%d b=%d\n", a, b);
Swap(a,b);
printf("交换后:a=%d b=%d\n", a, b);
return 0;
}
运行一下来看看结果:
交换前:a=10 b=20
交换后:a=10 b=20
很显然,程序是有问题的,并没有将a和b的值进行交换,来分析一下代码吧。




通过监视窗口可以知道a和b这两块空间与x和y这两块空间是完全独立的空间,所以对x和y的改变是不会影响到a和b的。调用函数的地方与函数内部的两个变量没有任何关系,所以不会互相影响。
这时候就用到了“指针”的知识点,任何一个变量在内存中都需要开辟空间。再来回顾一下关于指针的知识吧。
int main()
{
int a = 10;//此时就相当于在内存中开辟了四个字节的空间
//这四个字节的空间是有地址的,&a可以得到其地址;将a的地址存起来,将它放到变量pa里面
//pa的类型就是int*,这里面的pa就是一个指针变量。
int* pa = &a;//pa就是一个指针变量
//把a的地址托管给pa,pa与a之间就有了联系,就可以通过*pa来找到a来进行操作
//*pa;//通过pa里面的地址,要找到pa所指的对象(*pa就是指a)
*pa = 20;//这个时候a的值就变成了20 加一句“printf("%d\n",a)”来验证一下结果
printf("%d\n", a);
return 0;
}
运行结果如下:可以看到a的值被改为20了。
20
//*pa;//通过pa里面的地址,要找到pa所指的对象(*pa就是指a)根据指针的性质,对刚才报错的代码进行一下修正吧,代码如下:
void Swap(int* pa, int* pb)
//a的地址给过去之后,地址为整型地址,所以参数最好拿整型指针来接收
{
//*pa就是访问到的下面的a, *pb就是访问到的下面的b
int z = 0;
z = *pa;//此时z里面放的就是a的值
*pa = *pb;//a里面放的是b的值
*pb = z;//b里面放的就是a
}
int main()
{
int a = 10;
int b = 20;
//写一个函数,交换两个整型变量的值
printf("交换前:a=%d b=%d\n", a, b);
Swap(&a,&b);//将a和b的地址交给这个函数
printf("交换后:a=%d b=%d\n", a, b);
return 0;
}
运行结果如下:
交换前:a=10 b=20
交换后:a=20 b=10
成功地将a和b的值进行了交换。
3、函数参数
函数的参数分为形参和实参。
实际参数(实参):真实传给函数的参数叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。

形式参数(形参):形式参数是指函数名后括号中的变量,因为形式参数只有在函数在被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了(即:它的生命周期是在函数调用里),因此形式参数只在函数中有效。
在示例二中,x、y、pa、pb都是形式参数;在main函数中传给Swap中的a、b以及&a、&b是实际参数。在Swap函数被调用的时候,实参传给形参。其实形参是实参的临时拷贝。就是说在写错的那段代码中,x和y只是拷贝了a和b的值,给它又创立了独立的空间,它们的地址是不一样的。所以改变形参不会影响实参,自然那段代码中的a和b的值不会被交换。
边栏推荐
- HarmonyOS-3
- markdown/LaTeX中在字母下方输入圆点的方法
- 数商云:加强供应商管理,助推航空运输企业与供应商高效协同
- greendao使用问题
- One click to generate University, major and even admission probability. Is it so magical for AI to fill in volunteer cards?
- Second, the examinee must see | consolidate the preferred question bank to help the examinee make the final dash
- 一键生成大学、专业甚至录取概率,AI填报志愿卡这么神奇?
- js去除字符串空格
- [deep learning] storage form of nchw, nhwc and chwn format data
- Halcon 绘制区域 到图片中
猜你喜欢

数商云:加强供应商管理,助推航空运输企业与供应商高效协同

**Puzzling little problem in unity - light and sky box

食品饮料行业渠道商管理系统解决方案:实现渠道数字化营销布局

markdown/LaTeX中在字母下方输入圆点的方法

Research and development practice of Kwai real-time data warehouse support system

Home office should be more efficient - automated office perfectly improves fishing time | community essay solicitation

How to solve the problem that iterative semi supervised training is difficult to implement in ASR training? RTC dev Meetup

Dragon lizard developer said: first time you got an electric shock, so you are such a dragon lizard community| Issue 8

智慧园区SaaS管理系统解决方案:赋能园区实现信息化、数字化管理
![[5g NR] 5g NR system architecture](/img/78/6db70c18887c7a3920843d1cb4bdf3.png)
[5g NR] 5g NR system architecture
随机推荐
21set classic case
Gatling performance test
In the era of knowledge economy, it will teach you to do well in knowledge management
conda和pip命令
puzzle(016.2)指画星河
HarmonyOS. two
谷歌WayMo提出R4D: 采用参考目标做远程距离估计
The first open source MySQL HTAP database in China will be released soon, and the three highlights will be notified in advance
2022煤矿瓦斯抽采操作证考试题及模拟考试
取消冒泡
2022年质量员-设备方向-岗位技能(质量员)复训题库及在线模拟考试
2022年江西省安全员B证考试题库模拟考试平台操作
Method of establishing unity thermodynamic diagram
CONDA and pip commands
二叉树中最大路径和[处理好任意一颗子树,就处理好了整个树]
Three efficient programming skills of go language
How to solve the problem that iterative semi supervised training is difficult to implement in ASR training? RTC dev Meetup
杰理之在所有模式下打开喊话增加 mic 自动 mute【篇】
智慧园区SaaS管理系统解决方案:赋能园区实现信息化、数字化管理
智源社区周刊#86:Gary Marcus谈大模型研究可借鉴的三个语言学因素;谷歌提出媲美Imgen的文生图模型Parti;OpenAI提出视频预训练模型VPT,可玩MC游戏