当前位置:网站首页>C语言鹏哥20210812C语言函数
C语言鹏哥20210812C语言函数
2022-07-26 10:36:00 【竹某】
#1 函数
C语言函数又译为子程序,是一个实现程序中特定功能的代码块,具有相当的独立性。其具体执行过程和实现细节得到了隐藏。与程序的接口为“返回值”和“参数传递”。
函数的使用降低了程序中代码的重复率,提高了程序的简洁性。(复用函数,而不是代码块)
函数的使用提高了程序的安全性和debug效率。(函数体现了对整体功能的拆分,使我们能够分别对函数加以检查和纠错,从而保证程序整体的安全)
函数的使用提高了程序的健壮性。(可以通过添加新的函数扩充程序的功能,可以通过修改函数改变程序的功能)
函数的使用可以让程序更有层次感和组织感。(函数配合多文件编程能让程序得到更好的组织)
#2库函数
区别于自定义函数,是由C语言提供的常用的函数,放于C语言的库中。
可以通过:
en.cppreference.com
cplusplus.com
以查阅库函数。
#3自定义函数
定义自定义函数的具体的语法:
return_type fun_name(parameter_list){
block;
return value;
}
/*
return_type: 返回值类型
fun_name: 函数名
parameter_list: 形式参数列表,格式为(type para1, type para2, ...)
block: 函数的具体实现细节。被隐藏。
return value: return是C语言中的关键字,为函数的出口。value为return_type类型的值。
return语句的位置可以在函数的任何位置,其数目也没有上限,但是必需保证函数至少有一个
能够保证被执行的return语句(return_type为void时除外,但仍建议有)。
*/
上面的代码具体交代了函数的实现细节,称之为函数定义。
#4 调用函数
通过函数名+函数调用操作符()进行函数调用。
如sum = add(a,b);
可以使用对应类型的变量存放函数的返回值。这是因为fun_name()本身就是一个值为value1的表达式。
对于大多数函数,调用时需要向其传递参数。传递的方式有两种:1.按值传递(pass by value);2.按址传递(pass by reference)。有参数传递又衍生出另外两种概念:1.实参;2.形参。
实参是函数调用时实际传递给函数的参数(也就是函数调用时函数引用操作符中的值),而形参是函数定义或声明中函数引用操作符中的变量。后者只会在函数调用时分配内存空间,一旦函数调用结束,形参就会被销毁。两者的关系为:可以将形参视为相应实际参数的一份拷贝,对于形式参数的修改不影响实际参数的值。
对于按值传递而言,形参和实参分别对应不同的内存块,对于形参的修改不会改变实参。而pass by reference指的是把函数外部变量的地址传递给函数参数的一种调用方式。这种方式可以建立形式参数和函数外部变量(不能说是实际参数)的联系,即可以在函数内部通过地址来修改函数外部的变量(这相当于为函数开辟了一个与外部程序交互的新的接口)。
几个例子:
int add(int x,int y){
block;
}
//x,y为形式参数
int sum = add(a,b);
//a,b为实际参数。按值传递。
swap(&a,&b);
//按址传递。
#5 函数的嵌套调用和链式调用
函数的嵌套调用指的是:在函数的具体实现中调用另一个函数。
函数的链式调用指的是:把一个函数的返回值作为另一个函数的参数。
#include <stdio.h>
int main(){
printf("%d",printf("%d",prinf("%d",43)));
return 0;
}
//外层的printf为在main函数中的嵌套调用
//内存的两个printf为链式调用
#6 函数的声明与定义,多文件编程
函数声明:对函数的名称,返回值类型和参数列表的说明。
语法为return_type fun_name(parameter_list);
所有函数必需先声明后使用。函数的声明一般放在头文件(.h)中。
函数的定义在自定义函数中已经加以说明了,即函数的具体实现。一般放在源文件(.c)中
函数声明并不关心函数是否被定义。
#7 目前碰到过的函数相关错误
1.没有意识到参数和返回值是函数与外部程序的接口,不经传递就使用函数外部的变量
2.在函数内部使用sizeof计算传入数组的长度。这是不正确的。为了节省内存空间,数组都是按址传递的。
3.函数不能嵌套定义(自定义函数内部不能定义函数),但是可以递归定义,可以嵌套调用。
function(int arr1[],int *arr2);
//无论数组按哪种方式传入函数,其所占内存大小均为4/8
//因为arr1和arr2均为指针。
目前,尚未进行多文件编程的系统学习和实践。所以该处的问题尚存。
边栏推荐
- Inheritance method of simplified constructor (II) - class inheritance in ES6
- 并行、并发及对于高并发优化的几个方向
- datav漂亮数据屏制作体验
- Problems encountered in QRcode QR code (C language)
- SuperMap IClient for Leaflet 加载高斯克吕格投影三度分带CGCS2000大地坐标系WMTS服务
- Oracle cannot start tnslistener service cannot start
- STM32 Alibaba cloud mqtt esp8266 at command
- [Halcon vision] morphological expansion
- Uninstall Meizu app store
- 【机器学习小记】【风格迁移】deeplearning.ai course4 4th week programming(tensorflow2)
猜你喜欢
[leetcode每日一题2021/5/8]1723. 完成所有工作的最短时间
控制随机抽中几率 [ C# | Random ]
Centos8 (liunx) deploying WTM (asp.net 5) using PgSQL
Okaleido生态核心权益OKA,尽在聚变Mining模式
[leetcode每日一题2021/4/29]403. 青蛙过河
记给esp8266烧录刷固件
Some cutting-edge research work sharing of SAP ABAP NetWeaver containerization
【机器学习小记】【风格迁移】deeplearning.ai course4 4th week programming(tensorflow2)
一文详解Nodejs中fs文件模块与path路径模块
Redis Docker实例与数据结构
随机推荐
Issue 6: which mainstream programming language should college students choose
【机器学习小记】【风格迁移】deeplearning.ai course4 4th week programming(tensorflow2)
剑指Offer(七):斐波那契数列
Agenda express | list of sub forum agenda on July 27
.NET操作Redis List列表
【论文下饭】Deep Mining External Imperfect Data for ChestX-ray Disease Screening
Summary of common skills in H5 development of mobile terminal
数据分析入门 | kaggle泰坦尼克任务(一)—>数据加载和初步观察
Issue 5: the second essential skill for College Students
剑指Offer(九):变态跳台阶
oracle 启动不了 tnslistener服务启动不了
一些你不知道的 web API
剑指Offer(四十九):把字符串转换成整数
[Halcon vision] morphological expansion
Asynctask < T> decoration and await are not used in synchronous methods to obtain asynchronous return values (asynchronous methods are called in synchronous methods)
Redis implementation of distributed lock solution
异常的概念与处理
Analyze the hybrid construction objects in JS in detail (construction plus attributes, prototype plus methods)
json_ object_ put: Assertion `jso->_ ref_ count > 0‘ failed. Aborted (core dumped)
Oracle create index