C语言学习
前言
程序是由许许多多的零件组合而成的,函数就是这种零件的一个较小单位。本文简述一些函数的基础知识。
一、什么是函数?
函数这一名称,常常在数学中看到,而C语言中的函数是什么呢?
C语言中的函数是一个程序的组成部分,它可以是一个语句块,也可以是多个语句块构成。函数负责完成某项特定的任务,具备相对独立性。
二、C语言中函数的分类
1. main 函数
代码示例:
#include <stdio.h>
int main()
{
return 0;
}
C语言程序中 main 函数是必不可少的。程序运行的时候会执行 main 函数的主体部分。
2.库函数
main 函数中使用的 printf 、scanf 等函数,这种由C语言提供的非常多的函数称为库函数。
代码示例:
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
printf("%d", a);
return 0;
}
库函数查询工具:
- MSDN(Microsoft Developer Network)
- www.cplusplus.com
- http://en.cppreference.com(英文版)
- http://zh.cppreference.com(中文版)
3.自定义函数
自定义函数顾名思义就是程序员可以自己设计的函数,那如何设计一个自定义函数?
ret_type fun_name(para1, *) //函数头
{ //
statement;//语句项 //函数体
} //
ret_type 返回类型
fun_name 函数名
para1 函数参数
函数头:上面代码中的这部分:ret_type fun_name(para1, *) 被称为函数头,该部分表示的明朝和格式。它的作用更像是函数的“脸”。函数头由下面所述的三部分组成:
- 返回类型:函数返回的值的类型。
- 函数名:函数的名称。从其他地方调用函数时,使用函数名。
- 函数参数:用小括号括起来的部分,用于接收变量,需写明变量类型。接收多个变量的情况下用 “,” 隔开。
函数体:在{ }中的称为函数体。
代码示例:输出两个数中的最大数。
#include <stdio.h>
int Max(int x, int y)
{
if (x > y)
return x;
else
return y;
}
int main()
{
int a = 0;
int b = 0;
int m = 0;
scanf("%d %d", &a,&b);
m = Max(a, b);
printf("最大值是:%d", m);
return 0;
}
运行结果:
3 6
最大值是:6
示例代码中:
函数头:int Max(int x, int y)
- 返回类型:int
- 函数名:Max
- 函数参数:(int x, int y)
函数体:
{
if (x > y)
return x;
else
return y;
}
三、函数的参数
1.实际参数(实参)
- 实参:真实传给函数的参数。
- 实参可以是:常量、变量、表达式、函数等。
- 无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
2.形式参数(形参)
- 形式参数:指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。
- 形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
下列代码中的函数是否可以交换数值?
代码示例:
#include <stdio.h>
void Fun(int x,int y)
{
int z = 0;
z = x;
x = y;
y = z;
}
int main()
{
int a = 88;
int b = 66;
printf("交换前:a = %d b = %d\n", a, b);
Fun(a, b);
printf("交换后:a = %d b = %d\n ", a, b);
return 0;
}
运行结果:
交换前:a = 88 b = 66
交换后:a = 88 b = 66
不能实现交换的原因是什么?
当实参传递给形参的时候,形参是实参的一份临时拷贝,对形参的修改不会影响实参。
而上述代码中的 a 和 b 是实参,Fun函数中的 x 和 y 是形参,形参 x 和 y 只在Fun函数中有效。当函数调用完成之后就自动销毁了,不会影响实参。
四、函数的调用
1.传值调用
- 函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
2.传址调用
- 传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
- 这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
那有没有什么办法可以使函数交换数值呢?
代码示例:
#include <stdio.h>
void Fun(int* px, int* py)
{
int z = 0;
z = *px;
*px = *py;
*py = z;
}
int main()
{
int a = 88;
int b = 66;
printf("交换前:a = %d b = %d\n", a, b);
Fun(&a, &b);
printf("交换后:a = %d b = %d\n ", a, b);
return 0;
}
运行结果:
交换前:a = 88 b = 66
交换后:a = 66 b = 88
为什么这个代码可以实现函数的交换呢?
int a = 88; 就是在只能存放 int 类型的变量中存放了88这个数。变量就好比可以放东西的盒子,这个盒子里只能放一个东西,我们在一个名字叫 a 的盒子里放了一个数字 88 的东西。
&a 的意思是取出 a 变量的地址,&a 的作用就好比我们找到了名字叫 a 的盒子放在哪个位置。
Fun(* px , * py) 中* px 的意思是接收 a 的地址。这里的 px 也是变量,px 前面加了* 说明px是一个指针变量,所以它也像是一个盒子,用来临时存放 a 的地址。
z = *px; 这里的作用是将 a 的值赋给了 z 。px 盒子里存放了 a 的地址,* 的作用就是通过 a 的位置找到 a 这个盒子,它可以对 a 盒子里的东西做手脚。所以 z = *px; 这里是将 a 盒子里的数字88这个东西 copy 了一份,放在 z 这个盒子里,但是 z 这个盒子里原来有 0 这个东西,一个盒子只能放一个东西,于是 z 盒子只能将原来的0这个东西丢掉,放入 88 这个东西。
*px = *py; 这里是将 b 的值赋给了 a 。py 盒子里存放了 b 的地址,* 的作用就是通过 b 的位置找到 b 这个盒子,它可以对 b 盒子里的东西做手脚。这里将 b 盒子里的东西 66 给 copy 了一份,然后根据盒子 a 的位置,找到盒子 a ,并将 copy 来的 66 这个东西放进盒子 a 里,于是盒子 a 里有了和盒子 b 里一摸一样的东西66。
*py = z;这里是将 z 的值也就是 a 原来的值赋给了 b 。盒子 z 里放着 copy 盒子 a 之前的东西 88 ,这里根据盒子 a 的位置,找到盒子 a ,并将东西88放入盒子 a 。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了C语言中的函数,而函数还有很多作用,将在以后的文章里介绍。