函数的本质:对代码步骤的封装
函数有两种:一种是系统函数,另一种是自定义函数
函数声明格式/定义格式:返回值类型+函数名+参数列表+;
函数调用格式:函数名+具体参数+;
对于int/char/int*/......等等类型的函数,是有对应返回值的
void没有返回值,void字面意思就是“无类型”,所以顾名思义返回值不能有任何类型,所以我们如果需要退出函数,只添加return;就可以,不可在return后添加任何参数
· 举个栗子
//写一个两数加和函数
int add(int a,int b)
{
int c = a + b;
return c;
}
int main()
{
int a = add(1 ,2);
return 0;
}
我们可以看到我们定义的函数类型是int,返回值也只能是int型,先将主函数中add里的1和2传入到我们定义的函数add中两个参数a,b中,按顺序依次对应,不可以缺少参数,然后计算a+b等于3,最终我们主函数里的a得到的值就是返回的c,即3,所以主函数中的a即为3,这个单向传递参数的过程叫做值传递,而这整个过程就是函数调用,运行的过程
· 再举一个void类型例子
//用函数输出Hello
void Print_Hello()
{
printf("Hello");
}
int main()
{
Print_Hello();
return 0;
}
通过这个例子我们看到的是,我们只需要在函数里实现输出“Hello”,然后在任何地方调用都可以输出这么一句话,那么我们不需要返回值, 最后主函数调用,我们便会通过这样简单的函数,直接在命令框内看到输出的Hello
值传递与地址传递
下面为了大家能更形象理解,我写一个交换值的函数给大家帮助理解
#include<stdio.h>
void swap(int a,int b)
{
int p = a;
a = b;
b = p;
printf("a=%d b=%d\n",a,b);
}
int main()
{
int a = 10;
int b = 20;
swap(a ,b);
printf("a=%d b=%d\n",a,b);
return 0;
}
这段代码会输出的内容:
a=20 b=10
a=10 b=20
我们可以发现第一行为函数中printf输出的值,已经进行交换,但主函数里a,b却并未交换,这是为什么呢?
因为值传递(如传~bushi)顾名思义,我们只传递了值,由于我们的变量有自己的地址,而且在值传递过程中这个值回复给函数里对应参数,这样的话再该函数中进行的实际上是函数内部变量的值交换,故我们仅仅只有调用对应的指向变量地址的指针我们才能真正在函数中实现改变主函数中真正的值
这里有些难理解我来写一串代码,并画图做解
#include<stdio.h>
void swap(int* a, int* b)
{
int p = *a;
*a = *b;
*b = p;
printf("a=%d b=%d\n", *a, *b);
}
int main()
{
int a = 10;
int b = 20;
swap(&a, &b);
printf("a=%d b=%d\n", a, b);
return 0;
}
注意:1.参数要以指针形式
2.主函数调用时记得写取地址符号&
3.(本函数)p是整形变量,不可定义为指针变量,不然实现时由于调用指针,会导致p的值一直跟随a的改变而改变
这次我们定义参数时,用的是两个指针a和b,所以我们传参时传的一定是地址,虽然这个过程是值传递,但是我们却能通过这个地址找到地址对应的数值,我们可以简单理解为地址并非单纯的数值,在电脑里是可以找到对应位置的,这样我们就可以得到主函数a,b的位置,并且通过间接引用调换a,b,主函数的a,b也会随之交换,这便是地址传递
下面是图解
至此,函数的部分到此结束,未来函数功能的各种实现以及其他函数的嵌套混杂都是需要灵活运用的,而对于返回值的理解,初学者可以暂且把它当成一个计算式子得到的结果,至于它其他的内容我会在未来一一讲解
后记
给个关注,给个点赞!!!!