函数(1)

简介: 函数(1)

本章需要了解的重点主要包括以下几点:


1. 函数是什么

2. 库函数

3. 自定义函数

4. 函数参数

5. 函数调用


一:函数是什么?


用官方的话来解释就是:


在计算机科学中,子程序(英语: Subroutine, procedure, function, routine, method,

subprogram, callable unit ),是一个大型程序中的某部分代码, 由一个或多个语句块组

成。它负责完成某项特定任务,而且相较于其他代 码,具备相对的独立性。

一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软

件库。

其实就是一段独立于主程序的一个子程序,可以完成特定的任务。


二:函数的分类:


分为两种


1.由编译器提供的可以完成各种功能的叫做库函数。


2.由我们自己去写的函数,可以完成自己需要的功能叫做自定义函数。


库函数:


在我们编写代码的过程中频繁出现了我们所需要的某些功能,而不同的程序员写出了不同的代码,它们不是业务性的代码。我们在开发的过程中每个程序员都可能用的到,为了解决这种大量且重复的代码,开发者提供了库函数这一概念,方便程序员 进行软件开发为了支持可移植性和提高程序的效率。


最常见有printf用于输出,strcpy用于复制字符串,strlen用于计算数组大小,等等等等。                  而对于这些我们是否都需要去记忆,答案是否定的。有一个专门的网站提供给我们去查找所有的库函数:www.cplusplus.com只能在这里看英文版的,想看中文版的是http://zh.cppreference.com这个网站。我们可以在里面查找到任意一个库函数,包括他们存在的头文件。


在使用某个库函数时,必须要加上#include<头文件名>,我们并不需要记住所有的库函数,只需要学会查询即可。


自定义函数:


对于库函数而言,它并不能解决所有问题,要是能的话,还需要程序员做什么呢?


所以我们学习的重点就在于自定义函数。


自定义函数和库函数一样,有函数名,返回值类型和函数参数。

但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间。

之前说过最简单的main函数,我们所有的自定义函数都和main函数一样,需要函数名、返回类型、参数列表,其余的则自己决定。

例如:设计一个函数,求两个数的最大值

#include <stdio.h>
int max(int x, int y) {
 return (x>y)?(x):(y);
}
int main()
{
 int num1 = 10;
 int num2 = 20;
 int max = max(num1, num2);
 printf("max = %d\n", max);
 return 0;
}

在例如写一个函数,交换两个数的值,

#include <stdio.h>
void swap1(int x, int y) {
 int tmp = 0;
 tmp = x;
 x = y;
 y = tmp;
 }
int main()
{
 int num1 = 1;
 int num2 = 2;
 swap1(num1, num2);
 printf("swap1: num1 = %d num2 = %d\n", num1, num2);
 return 0; 
}


对于这个swap函数并不能得到我们想要的结果。


46cac164da6649e9a2cd3eef560023ce.png


它似乎并没有交换num1和num2的值这是为什么呢?


三:函数的参数:


实际参数(实参):


真实传给函数的参数,叫实参。 实参可以是:常量、变量、表达式、函数等。

无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形

参。


形式参数(形参):


形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内

存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有 效。

简单来说就是对实参的一个拷贝,本身并不影响实参。

上面的例题中num1和num2作为swap函数的实参,x、y则是函数的形参。 x、y本身是并不形象实参,形参的本质是在被调用是开辟了一块空间,拷贝了一份实参的数据被保存在了该地址中,而实参则是另一块空间上开辟了空间,所以在形参空间上做出改变,并不影响实参的空间

那么要解决上面那道例题该如何呢?


我们这里需要用到函数的调用。


四:函数的调用


传值调用


函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。


传址调用


传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。

这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操

作函数外部的变量。

这里需要用到取地址操作符 ' & '。代码如下

#include <stdio.h>
void swap2(int *px, int *py) {
 int tmp = 0;
 tmp = *px;
 *px = *py;
 *py = tmp; 
}
int main()
{
  int num1 = 1;
  int num2 = 2;
  swap2(&num1, &num2);
  printf("swap2:  num1 = %d num2 = %d\n", num1, num2);
  return 0;
}

结果如下


6b11076623a74bb18f4fddf7329d3620.png

这才正真的将值调换


我们这里&num1和&num2所传进去的都是地址,所以x、y对应的也都是地址,那么我们要得到地址中存放的数据,就用到了解引用操作符 ' * ' 。在swap2中改变x和y就是改变main中的num1和num2。


五:结束语:


本章先简单的介绍部分函数基础,下一章将介绍函数更多重点。当然想要更好的的掌握函数还是需要多写代码,多做练习。

相关文章
|
弹性计算 固态存储 关系型数据库
冬季实战营第一期:从零到一上手玩转云服务器-学习报告
动手实操ECS云服务器、快速搭建LAMP环境、部署MySQL数据库、快速搭建Docker环境、从零搭建Spring Boot、使用PolarDB和ECS搭建门户博客
442 1
|
存储 编解码 JSON
阿里云高校计划视觉AI五天训练营Day 4
阿里云视觉智能平台能完成车型识别、车牌识别、机动车检测、车辆部件识别、车辆损伤识别、车辆仪表盘识别、车险图片分类等多种车辆鉴定功能。
阿里云高校计划视觉AI五天训练营Day 4
|
监控 Cloud Native 存储
蚂蚁金服轻量级监控分析系统 SOFALookout 服务端开源
SOFA Scalable Open Financial Architecture 是蚂蚁金服自主研发的金融级分布式中间件,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤炼出来的最佳实践。
1202 0
|
移动开发 数据可视化 小程序
在互联网的时代,传统企业怎么去转型?通过哪种方式?
互联网时代之于传统企业,与其说是转型,倒不如说是一次进化。 不少传统企业主反馈,互联网形势下,转型是找死,不转型是等死。那么,互联网之于企业发展,究竟是洪水猛兽还是诺亚方舟呢? 互联网 互联网是工具,是必然到来的新型工具,无论是对个人,还是企业。
1252 0
|
分布式计算 算法 搜索推荐
Hadoop之父:Doug Cutting
hadoop 生活中,可能所有人都间接用过他的作品,他是Lucene、Nutch 、Hadoop等项目的发起人。是他,把高深莫测的搜索技术形成产品,贡献给普罗大众;还是他,打造了目前在云计算和大数据领域里如日中天的Hadoop。
1454 0
unity3dUGUI实现icon图标自动与数字对齐
有时候需要显示货币和数量,特别是商店和道具用的最多,需要一个icon和一个数字,比如数字右对齐,icon根据count进行右移,效果如下 测试.
1733 0
|
弹性计算 大数据
《MMO类游戏解决方案》重磅发布
随着游戏行业的发展,休闲类、卡牌类游戏已经无法满足玩家对高品质游戏的追求,同时移动终端硬件配置也在飞速提升,满足了MMO RPG、MOBA等中重度游戏运行对硬件的要求,越来越多的MMO类产品随之诞生。
|
Linux 虚拟化