C语言学习 从入门到进阶(六)

本文介绍了C语言中的函数概念,包括库函数如printf和scanf的使用,以及如何通过#include指令引入头文件。讨论了字符串操作函数strcpy的实例,并解释了其返回值。接着,文章阐述了自定义函数的定义和调用,以交换两个数的函数为例,展示了传值调用和传址调用的区别。最后,提到了指针在函数参数传递中的关键作用,以解决值无法正确交换的问题。
摘要由CSDN通过智能技术生成

C语言学习 从入门到进阶(六)

这一期我们来讲讲函数
函数是什么?我们回顾一下我们在初中,高中学习的函数,比如一次函数,二次函数……。
C语言中的函数也是一样的。我们在一开始就见过函数了。
那就是主函数
int main()

库函数

库函数就是一些C语言原本就有的一些函数。比如printf()、scanf()……;
在引用这些函数的时候要用到头文件。
接下来是对函数的一些分类。
IO函数
字符串操作函数
字符操作函数
内存操作函数
时间/日期函数
数学函数
其他库函数

我们先来看看一个函数吧

#include<stdio.h>
#include<string.h>
int main()
{
	char a[] = "hello";
	char b[] = "word";
	strcpy(a, b);
	printf("%s", a);
	return 0;
}

在这里插入图片描述

我们看到一个新的面孔那就是strcpy()
这个函数是用来干嘛的呢?
其实就是把括号里面的后一个里面的字符串复制并且覆盖到前面那个字符串。这个函数的头文件就是<string.h>;这样库函数就可以应用了。其他的库函数其实也差不多。
其实深入了解这个函数之后我们可以这么写。

#include<stdio.h>
#include<string.h>
int main()
{
	char a[] = "hello";
	char b[] = "word";
	char *c = strcpy(a, b);
	printf("%s\n", c);
	printf("%s", a);
	return 0;
}

在这里插入图片描述
是不是很神奇,其实去网上查查就知道了,strcpy是有返回值的。返回值是首元素地址。这边只是实列所以不过多展开。如果想要了解更多就关注关注,下次学习不迷路

自定义函数

库函数里面的函数有很多,但是也解决不了所有事情所有我们也需要自定义一些自己的函数
那自定义函数需要些什么呢?
我们用int main()样例来讲解
我们从左往右看,第一个遇到的就是int,我们在很早的时候就知道了int 是整形类型。这个int 就跟我们定义变量的时候是一样的,表示这个函数的返回类型是int类型的。之后遇到的是main这个就是函数的名字。表示这个函数叫做main。
那之后的括号里面是什么呢?我们可以联想一下数学里面的函数。比如y = x;这个一次函数。我们在高中可以写成f(x)= x;那我们要求x = 1的时候的时候,我们是不是在f后面的那个括号里面写一个1;那C语言中的函数括号也是一样的。这里面存放的就是未知变量的取值。那不写是什么意思呢?其实就说明这个变量不需要输入值。
我们来一个实列

//创建一个自定义函数来返回两个值中较大的值
#include<stdio.h>
int max(int a, int b)
{                                 //用来实现这个函数的功能
	if (a > b)
	{
		return a;
	}
	return b;
}
int main()
{
	int x = 20;
	int y = 30;
	printf("%d", max(x, y));
	return 0;
}

在这里插入图片描述
这个就是自定义函数的大致模样。
那我们再来实践一下。
写一个交换函数,就是把两个数字做交换。
那我们都知道的是交换通常会新定义一个变量,然后利用这个新的变量来做交换

#include<stdio.h>
int main()
{
	int a = 30;
	int b = 20;
	int c = 0; // 利用这个C变量来交换a和b里面的值
	c = a;
	a = b;   //交换
	b = c;
	printf("%d %d", a, b);
	return 0;
}

这个就是普通的交换,那我们把交换的部分写到自定义函数里面。
那我们就要先定义一个函数,我们就叫他swap吧。然后我们思考,我们这个函数需要返回值嘛?好像不用,那我们就用void来定义这个函数。那我们现在就要确定参数,我们传入的两个值是不是都是int 类型的,那我们就在定义的时候()在这个里面就写int x,int y那完整的就是

#include<stdio.h>
void swap(int x, int y)
{

}
int main()
{
	int a = 30;
	int b = 20;
	swap(a, b);
	printf("%d %d", a, b);
	return 0;
}

那我们还没有确定里面的语句是什么,那我们都知道这个函数都是用来交换的,那么里面的语句也是跟交换有关的。那么大括号里面就是交换。
那么完整的代码就是这样的

#include<stdio.h>
void swap(int x, int y)
{
	int c = 0;
	c = x;
	x = y;
	y = c;
}
int main()
{
	int a = 30;
	int b = 20;
	swap(a, b);
	printf("%d %d", a, b);
	return 0;
}

我们运行之后
在这里插入图片描述
我们发现这个居然没有改变,这是为什么呢?
学习过我的指针系列课程的朋友们都知道这是为什么。
因为自定义函数里面的 x,y是形参,是不能改变外面的实参的。
就比如说我瞒着我爸爸去了网吧玩电脑,我爸爸在家里面找不到我,就让我弟弟去找我,那在我弟弟不知道我所在地址的时候,我弟弟能找到我吗?我相信我弟弟是找不到我的。
这时候,我兄弟为了看我被我爸爸打。我兄弟两肋插刀,给我爸爸打电话,告诉了我爸爸,我所在的地址,此时,我爸爸来找我,他能找到我吗,这当然是可以的啦。
所以上面没有交换是因为x,y不知道a,b的地址,所以并不能改变a,b的值。
那我们怎么能知道地址呢?
那就是指针。这边我不多赘述,想知道的就去看看我的指针系列文章。

#include<stdio.h>
void swap(int* x, int* y)
{
	int c = 0;
	c = *x;
	*x = *y;
	*y = c;
}
int main()
{
	int a = 30;
	int b = 20;
	swap(&a, &b);
	printf("%d %d", a, b);
	return 0;
}

在这里插入图片描述
好啦,这个自定义函数学会了吗?

函数的调用

传值调用
传址调用
这两个的区别就像我们交换函数的两个区别。一个只是传值,另一个是传地址。传值是不改变原来传输的对象的。传址是可以改变传输对象的。
好啦,文章就到这了,大家下次再见吧。
我是JackChao我们一起进步

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值