C语言学习 从入门到进阶
Posted Jack Chao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言学习 从入门到进阶相关的知识,希望对你有一定的参考价值。
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我们一起进步
以上是关于C语言学习 从入门到进阶的主要内容,如果未能解决你的问题,请参考以下文章