【C语言】函数详解-创新互联
🔥🔥 欢迎来到小林的博客!!
桃山网站制作公司哪家好,找创新互联公司!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。创新互联公司于2013年开始到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联公司。
🛰️博客主页:✈️小林爱敲代码
🛰️专栏:✈️C语言快速入门
🛰️欢迎关注:👍点赞🙌收藏✍️留言
这篇文章给大家介绍C语言中函数的使用,本来打算昨天为大家更新的。但是阳了,早上刚挂完点滴,就跑来更新博客了。🌺🌺
每日一句: 成功不是将来才有的,而是从决定去做的那一刻起,持续积累而成。
大纲:
函数内容的大纲:
- 💖7 函数
- 💪7.2 函数的声明和定义
- 🔮7.2.1 函数的声明
- 🔮7.2.2 函数的定义
- 💪7.3 函数的调用和传参
- 🔮7.3.1 函数的调用
- 🔮7.3.2 函数的传参
- 💪7.4 函数的返回值
- 💪7.5 函数的传址调用
- 💪7.6 函数的嵌套调用
- 💪7.7 函数的递归
- 结言🥳:
💪7.2 函数的声明和定义 🔮7.2.1 函数的声明函数有2类,一类是库函数,一类是自定义函数,库函数就是C语言为我们提供的。例如我们常用的 printf(),scanf(),这些都是C语言为我们提供的库函数。自定义函数则是我们自己定义的函数,自己定义,自己调用。
函数的声明定义格式为: 返回值类型 函数名(参数列表);
返回值类型:就是数据类型,如果没有返回值类型则用void。
函数名:随意,但在C语言中,函数名不能重复。
参数列表:就是传给函数的数据。
以下是函数声明的例子:
#include//一个无返回值,无参数的函数声明
void a();
//一个无返回值,有1个int参数的函数声明
void b(int a);
//有1个int类型参数和1个double类型参数 ,且有返回值为int类型的函数
int c(int a,double d);
int main()
{return 0;
}
函数的声明一般会放在.h的头文件中。
🔮7.2.2 函数的定义函数声明之后,我们需要定义。定义的话就直接把声明函数展开。
函数的定义格式为: 返回值类型 函数名(参数列表) { 函数体;}
函数定义如下:
#include//一个无返回值,无参数的函数声明
void a();
//一个无返回值,有1个int参数的函数声明
void b(int a);
//有1个int类型参数和1个double类型参数 ,且有返回值为int类型的函数
int c(int a,double d);
//函数a的定义
void a()
{printf("a");
}
//函数b的定义
void b(int a)
{printf("b");
}
//函数c的定义
int c(int a, double d)
{printf("c");
//有返回值必须返回一个值
return 0;
}
int main()
{return 0;
}
当然,函数在定义的时候,如果未声明,会自动声明。
所以也可以这样:
#include//函数a的定义,前面未声明在此处自动声明
void a()
{printf("a");
}
//函数b的定义,前面未声明在此处自动声明
void b(int a)
{printf("b");
}
//函数c的定义,前面未声明在此处自动声明
int c(int a, double d)
{printf("c");
//有返回值必须返回一个值
return 0;
}
int main()
{return 0;
}
那么问题来了,既然定义时候会自动声明,那为什么还要声明呢?这是因为文件扫描是从上往下的,如果发现调用了一个函数,可函数在下面实现。那么就无法识别到这个函数。
例如:
#include//函数a的定义
void a()
{printf("a");
}
int main()
{ a();//调用函数a
return 0;
}
这个代码因为定义在main函数的前面,所以可以调用。但是如果定义在main函数的下面,那么main函数调用a函数时,无法识别到a,就会出错。
#includeint main()
{ a();//调用函数a
return 0;
}
//函数a的定义
void a()
{printf("a");
}
所以这时候加上声明,就可以正常运行了。
函数的调用很简单,上面就有演示。
函数的调用格式: 函数名(参数列表);
参数列表要和函数定义时的参数列表匹配
函数调用的例子:
#include//函数 a没有参数
void a()
{printf("a");
}
//函数 b有1个int参数
void b(int b)
{printf("b");
}
int main()
{ a();//函数名(参数列表); 但是函数a没有参数,所以不用传参
b(1); //函数名(int); 因为函数定义时有1个int类型参数,所以必须传1个int类型
return 0;
}
🔮7.3.2 函数的传参函数的传参上面调用b时也演示过了,就是根据函数定义(声明)时的参数列表一一对应传参。所以再为大家提供几个传参例子。
#include//参数列表 (int)
void b(int b)
{printf("b");
}
//参数列表 (int,double,char)
void c(int a,double b , char c)
{printf("b");
}
int main()
{b(1);//传参列表(int)
c(1,1.1,'a'); //传参列表(int,double,char);
return 0;
}
不过需要注意的是, 传参给函数的参数叫实参。而函数接收的参数叫形参,形参是实参的临时拷贝,改变形参不会影响实参的值。
#include//参数列表 (int)
void b(int c)
{c = 5;
}
int main()
{int c = 2;
b(c);//传参列表(int)
printf("%d ", c);
return 0;
}
如图,C的值并没有发生改变
当你期待一个函数会返回你一个特定的值时,你可以选择带返回值的函数。如果没有返回值,那么返回值的类型就是void。
假设我要实现一个Add函数,用来求2个数的和。
#include//返回值的数据类型为int
int Add(int x, int y)
{int z = x + y;
return z;
}
int main()
{int z = Add(3, 5); //用 z 来接收函数的返回值
printf("%d ", z);
return 0;
}
💪7.5 函数的传址调用如果我们期望改变实参的值,我们可以选择传址调用,传址调用就是传指针给函数。然后函数对指针指向的空间进行操作。
#includevoid Swap(int* a,int* b)
{int tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{int a = 10;
int b = 20;
printf("%d,%d\n", a, b);
Swap(&a, &b);//传a和b的地址进去
printf("%d,%d\n", a, b);
return 0;
}
我们会发现a 和 b 的值发生了变化。因为我们给函数传的是 a 和 b的地址,而函数内部通过对a 和 b 解引用找到 a和b所在的内存空间。从而让它们进行交换。
函数的嵌套调用,就是我们在另外一个函数调用其他函数。
#includevoid b()
{printf("b\n");
}
void a()
{printf("a\n");
b(); //a函数里面调用 b函数
}
int main()
{a();//main函数里面调用函数a
return 0;
}
所以,函数也是可以嵌套调用的。
递归,栈溢出的罪魁祸首!什么是递归呢?简单来说,就是函数自己调用自己本身。比如以下代码,main函数一直调用自己。如果没有递归的终止条件的话,那么就会出现栈溢出。
#includeint main()
{main();
return 0;
}
所以在使用递归时,我们需要注意两点,一点是递归的结束条件,还有一点就是这个条件每递归一次都要发生变化。
比如我想实现一个函数,要求把一串数字倒着输出。
#includevoid a(int n)
{//当n=0时,递归终止
if (n == 0)
{return;
}
printf("%d ", n % 10);
//自己调用自己
a(n / 10);
}
int main()
{int n = 12345;
a(n);
return 0;
}
以上程序的递归展开图:
💦💦如果有写的不好或者错误的地方,希望大家指证出来,我会不断的改正自己的错误。💯💯如果感觉写的还可以,可以点赞三连一波哦~🍸🍸后续会持续为大家更新大纲上的内容,以及数据结构,C++,Linux操作系统等方面的知识,本人会坚持持续更新。
🌺🌺拖着发烧的身体也要更新!你们的支持是我大的动力,希望在往后的日子里,我们大家一起进步!!!🌺🌺
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
新闻名称:【C语言】函数详解-创新互联
地址分享:http://myzitong.com/article/despji.html