c语言初阶(2-函数-上篇)
目录
1.函数是什么?
1.1库函数
cplusplus.com - The C++ Resources Network
1.2自定义函数
2.函数的参数
2.1实参:
2.2形参:
注意:
3.函数的调用
3.1传值调用:
3.2传址调用:
4.函数的嵌套和链式访问
先补充一下printf的返回值:
4.1嵌套调用:
4.2链式访问:
5.函数的声明和定义
6.小练习
6.1写一个函数可以判断一个数是不是素数。
6.2写一个函数判断一年是不是闰年。
6.3 写一个函数,每调用一次这个函数,就会将num的值增加1。
因为最近确实很忙,很多事堆到一起,所以东西出的频率会降低一些(可怜)。那我们直接进入正题吧。
1.函数是什么?
函数的本质是子程序,子程序就是一个大型程序中的部分代码,实现一个个功能,用来完成某项特定的任务,具有高内聚低耦合的性质(即独立性强,只完成自己的某项任务,不与外界过多联系)。
1.1库函数
所谓库函数,实际上就是一堆函数的仓库,每个函数的功能由代码实现,而里面的函数代码就是大牛们自己编写的,他们将一些我们经常要使用的函数进行功能封装,写到一个个函数中,如打印函数、字符串的拷贝函数、平方函数、多次方运算函数等,这些常用函数按照类别被放在一个个函数库中,方便人们直接调用,目的是为了减少人们的使用成本,极大地增加了便利性。
那么到底都有些什么库函数呢?可在该网站中进行查看 :
cplusplus.com - The C++ Resources Network
该网站可当作函数库使用,用于查询各种库函数,十分方便(如果对英语有抵触的人也可以用谷歌翻译或者浏览器页面翻译,但还是建议掌握基本的计算机英语,对前沿技术的学习十分有帮助)
1.2自定义函数
库函数里面可以调用我们经常用到的函数,实现基本功能,是面向所有人的,但仍有许多功能需要程序员自己来编写以便于实现自己想要的功能,自定义函数给了程序员很大的发挥空间,你想要的所有功能都可以由自己编写和设计。
如一个简单地小函数,求两个整数的最大值
#pragma warning(disable:4996)#include <stdio.h>//get_max函数的设计int MyMax(int x, int y){return (x > y) ? (x) : (y);}int main(){int num1, num2;scanf("%d %d", &num1, &num2);int max = MyMax(num1, num2);printf("max = %d\n", max);return 0;}
2.函数的参数
2.1实参:
可以是常量、变量表达式、函数、指针等,实参有着确定的值,是在函数调用时真实传递给函数的参数。
2.2形参:
用来接收传递给函数的实参,在调用函数时发生形参实例化,进行对实参的临时拷贝,开辟内存,只有此时形参才具有实际意义,一旦函数结束,形参就会被销毁,内存又被释放掉
如上面求两个数较大值得函数MyMax中,num1,num 2 是传递给函数的实参,x,y是形参,在函数调用时,发生临时拷贝,为x y开辟内存,发生形参实例化,执行完MyMax后,x y被销毁,内存释放。
注意:
在发生形参实例化的时候,形参拷贝实参时其形参本身也要开辟空间,因此形参和实参虽然值相等,但存储地址是不同的,因此在改变形参时,实参并不会随之改变,就如同两个一样的房子,烧了甲房子,乙房子依然在且完好。
3.函数的调用
3.1传值调用:
形参和实参实际占有不同的内存块,形参不影响实参
可以发现在上图中,swap交换函数明明没有错误,为什么调用前后x,y值依然相等呢?实际上,Swap函数确实把x,y的值进行了交换,只不过交换的x,y是另外地址中存储的x,y(形参x,y拷贝实参x,y开辟新的地址),而原地址的x,y值并未发生交换。这叫做传值调用。
3.2传址调用:
将实参的地址传递给形参存储,形参根据该地址可以修改实参的值,但要注意的是,形参本身依然开辟了一个新的空间,这个空间用来存储实参的地址,此时形参和实参可以建立起真正的联系
我们来对上面的交换函数进行修改
//交换两个整型变量#pragma warning(disable:4996)#include<stdio.h>void Swap(int* x, int* y){int tmp = *x;*x = *y;*y = tmp;return;}int main(){int x, y;scanf("%d %d",&x,&y);printf("交换之前——x=%d,y=%d\n", x, y);Swap(&x,&y);printf("交换之后——x=%d,y=%d\n", x, y);return 0;}
上面程序中:函数的实参是x的地址和y的地址,而用来接收这两个地址的形参是指针变量(用指针变量接收地址,该指针变量指向指针所指向的目标),即*x就是x,*y就是y,由于直接更改原地址中的值,所以实参会进行变量的交换
4.函数的嵌套和链式访问
先补充一下printf的返回值:
printf函数在显示中打印了多少个字符就返回多少,如printf(“54”)的返回值就是2,因为5和4 是两个字符
4.1嵌套调用:
通过函数来调用另一个函数,实现函数嵌套
4.2链式访问:
将一个函数的返回值作为另一个函数的参数
5.函数的声明和定义
函数的声明和定义我们在前面已经进行了一定的区分,相信大家都有了一定的了解,在此处不在进行赘述,只进行一定的小复习记忆。
- 函数定义只能定义一次,而函数声明可以进行多次声明。
- 函数声明相对于函数定义的区别是函数声明并没有函数体。
- 函数声明实际上就是告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了,函数定义来决定一个函数是否存在.
- 函数的定义是指函数的具体实现,用来交代函数的具体 功能实现。
- 函数的声明一般出现在函数的使用之前。要满足先声明后使用。
- 函数的声明一般要放在头文件中的(头文件中不进行定义)。
6.小练习
6.1写一个函数可以判断一个数是不是素数。
#include<stdio.h>#include<math.h>int main(){int count = 0;for (int n = 1; n < 150; n+=2){int j;for (j = 2; j <=sqrt(n); j++){if (n % j == 0){break;}}if (j > sqrt(n)){printf("%d ", n);count++;}}printf("\n%d", count);return 0;}
6.2写一个函数判断一年是不是闰年。
//判断1000~2000之间的闰年#pragma warning(disable:4996)#include<stdio.h>int main(){for (int i = 1000; i <= 2000; i++){if(((0==i%4)&&(0!=i%100))||(0==i%400)){printf("%d ",i);}}return 0;}
6.3 写一个函数,每调用一次这个函数,就会将num的值增加1。
#pragma warning(disable:4996)#include<stdio.h>int Add(void){static int num = 1;return ++num;}int main(){int x = 10;while (x){printf("%d ", Add());x--;}//调用函数,使得num每次增加1return 0;}
本篇把函数的概念大致讲清,但特意漏过了函数的递归,我将把函数的递归作为单独的一章,进行第一次对递归的浅析。大家晚安(留个赞吧——)
c语言初阶(2-函数-上篇)相关推荐
- C语言初阶(18) | 数组详解
目录 1.数组的定义 2.一维数组 2.1一维数组的格式 2.2一维数组的初始化 2.3一维数组的使用 2.4一维数组再内存中的存储 3.二维数组 3.1二维数组的创建和初始化 3.2二维数组的使用 ...
- C语言初阶作业题-数组
C语言初阶作业题-数组 一.选择题 1.关于一维数组初始化,下面哪个定义是错误的?( ) A.int arr[10] = {1,2,3,4,5,6}; B.int arr[] = {1,2,3,4,5 ...
- C语言初阶_初识C语言(1)
凡是过往,皆为序章 期末考试结束了,真是感慨良多啊...... C语言编程题大家都做对了多少呢? 不管怎么样,都已经过去了.不管你学得怎么样,都可以在接下来的时间里,我们一起重新回顾一遍C语言初阶的知 ...
- C语言初阶——5.字符串
C语言初阶--5.字符串 1. 字符串操作 1.1 字符串遍历 可以通过数组方式遍历字符串. char* str="Hello World"; for(int i = 0;'\0' ...
- 五十分钟带你看遍C语言初阶语法(总纲)
C语言初阶语法(总纲) 此篇博客包含了前面C语言所有的基础语法,写这一期的博客不仅是为了记录自己的学习成果也是为了让更多的朋友能学到对自己有用的知识,如果总有一个知识点帮助到了你,给卑微博主点点关注加 ...
- C语言初阶——6.进制
C语言初阶--6.进制 1. 进制 百度百科: 进制也就是进位计数制,是人为定义的带进位的计数方法,对于任何一种进制-X进制,就表示每一位置上的数运算时都是逢X进一位. 十进制是逢十进一,十六进制是逢 ...
- C语言初阶第三篇:换我心,为你心,始知C语言 从C语言选择语句到循环语句保姆教学来喽
换我心,为你心,始知C语言 老铁们,咱们上一篇文章把字符串的知识点给过了一遍,今天就要开始真正的程序语句的学习了,也就是选择语句和循环语句,今天的内容比较简单,所以写的也不多,废话不多说,咱们开始吧! ...
- C语言初阶总结 v1
目录 C 基础1⭐ 数据类型 计算机中的单位 常量与变量 字符串/转意字符/ 注释 C 基础2⭐ 判断语句 函数与数组 C语言操作符 C语言关键字 C语言定义宏与关键字 初始指针 ⭐⭐ 指针基础 拓展 ...
- C语言初阶,知识点简介(2)
2.12 #define定义宏和符号常量 (1)#define 定义符号常量(为了和变量区分,使用大写) #define MAX 100 int main() {int arr[MAX] = { 0 ...
- 《C语言初阶》 猜数字小游戏
大家好,这篇文章主要教大家写个小游戏,学习编程的时候我们肯定都有一个梦想就是想写出属于自己的游戏.这次,我们就从0到1开始写一个非常简单的猜数字小游戏,当你写完时和你的朋友一起玩吧! 首先,我们制定一 ...
最新文章
- php截取剩余部分,PHP从字串中截取一部分,支持使用(*)模糊截取
- TypeScript Type Assertions - 类型断言
- php中getdistance函数_php代码渗透测试 后门分析篇
- leetcode134. 加油站
- try catch finally 中包含return的几种情况,及返回结果
- 周记(2015-11-30 -- 2015-12-05)
- 计算与推断思维 四、数据类型
- android string拼接字符串_「JAVA」细述合理创建字符串,分析字符串的底层存储,你不该错过...
- Web Api 内部数据思考 和 利用http缓存优化 Api
- c++学习---继承与派生类
- WiFi 连接到网络的过程
- 20191107每日一句
- AR9285 bt3无线网卡驱动
- interpretable machine learning
- Revisiting Domain Generalized Stereo Matching Networks from a FeatureConsistency Perspective
- 阿里达摩院——算法面经
- 网络篇 OSPF的LSDB过载保护-52
- php示例代码之使用MySQLi接口
- com.googlecode.genericdao
- DDN | 时刻准备,马上出发!