自学第十五天----深入理解函数上

1. 函数是什么?

维基百科中对函数的定义: 子程序

在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method, subprogram, callable unit),是一个大型程序中的某部分代码, 由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代 码,具备相对的独立性。

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

2. C语言中函数

   1.库函数
   2.自定义函数

 2.1 库函数:

像上面我们描述的基础功能,它们不是业务性的代码。我们在开发的过程中每个程序员都可能用的到, 为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员 进行软件开发。

说白了就是开发c语言的人帮你设定好的函数,你直接拿去用就可以了

这是c++的库函数网站: www.cplusplus.com

简单的总结,C语言常用的库函数都有:

---IO函数

---字符串操作函数

---字符操作函数

---内存操作函数

---时间/日期函数

---数学函数

---其他库函数 

 需要全部记住吗?

Nonono! 只需要学会查询工具的使用:

MSDN(Microsoft Developer Network)

www.cplusplus.com

http://en.cppreference.com(英文版)

http://zh.cppreference.com(中文版)

2.2 自定义函 

相比于库函数更加重要的是自定义函数。

自定义函数和库函数一样,有函数名,返回值类型和函数参数。 但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间。

ret_type fun_name(para1, * )
 {
 statement;//语句项
}
 ret_type  返回类型
fun_name   函数名
para1      函数参数

举一个很经典的例子

写一个函数可以交换两个整形变量的内容。

首先说明一下,函数中如果不需要返回值,则使用void关键字 

#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;
}

看上去实现了其实并没有,因为函数中x,y与我们输入的a,b所代表的内存都不一样,这里只是将a与b的值赋给x,y进行计算,最终与a和b无关。

正确的写法应该是用int*调用其内存,使我们的a,b与x,y是相同的(所代表的内存相同)

 //正确的版本
void Swap2(int *px, int *py)
 {
 int tmp = 0;
 tmp = *px;
 *px = *py;
 *py = tmp;
 }
 int main()
 {
 int num1 = 1;
 int num2 = 2;
 printf("Swap2::num1 = %d num2 = %d\n", num1, num2);
 return 0;
 }

 3. 函数的参数

3.1 实际参数(实参):

---真实传给函数的参数,叫实参。

---实参可以是:常量、变量、表达式、函数等。

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

3.2 形式参数(形参): 

---形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内 存单元),所以叫形式参数。

---形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。

>   上述例子中 Swap1 和 num2 和传 给Swap2函数的 Swap2 函数中的参数 &num1 , x,y,px,py都是形式参数。

>   在main函数中传给 Swap1 的 &num1 ,&num2 是实际参数。 

可以看到 Swap1 函数在调用的时候,x,y拥有自己的空间,同时拥有了和实参一模一样的内容。 所以我们可以简单的认为:形参实例化之后其实相当于实参的一份临时拷贝。 

也就是说形式参数在使用时是根据输入参数多少重新分配相应的内存,再进行计算,与输入参数没有本质联系

相关推荐

  1. leetCode

    2024-07-12 11:20:04       54 阅读
  2. 开始学习

    2024-07-12 11:20:04       51 阅读
  3. 30精通Nodejs--:Websocket

    2024-07-12 11:20:04       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 11:20:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 11:20:04       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 11:20:04       58 阅读
  4. Python语言-面向对象

    2024-07-12 11:20:04       69 阅读

热门阅读

  1. docker-2

    docker-2

    2024-07-12 11:20:04      24 阅读
  2. k8s离线部署芋道源码后端

    2024-07-12 11:20:04       19 阅读
  3. 实时数仓项目需求及架构设计

    2024-07-12 11:20:04       19 阅读
  4. 66、Flink 的 DataStream Connectors 支持的 Formats 详解

    2024-07-12 11:20:04       17 阅读
  5. String的常用方法

    2024-07-12 11:20:04       30 阅读
  6. python字典

    2024-07-12 11:20:04       27 阅读
  7. aws课程,认证,学习方法

    2024-07-12 11:20:04       23 阅读