C语言基础----函数

一、基本概念

  1. 函数就是用来实现某个功能的程序段,每个函数都有自己的功能。
  2. 一个C程序中可能会有很多的函数。为了方便调用和区分这些函数,需要为每一函数都起一个唯一的名称,函数的命名必须按照标识符命名规则。利用调用函数名可以调用到对应的函数。

三、定义

1.任何一个函数在使用之前都必须进行定义

返回值类型      函数名(形式参数列表)
{
	函数体
}

2.举例
比如定义一个函数用来计算两个整数的和。那么可以写成下面这样:

#include <stdio.h>

int sum(int a, int b)
{
    int c = a + b;
    return c;
}

int main()
{
    int d = sum(10, 11);
    
    printf("d is %d", d);
    return 0;
}
  • 分别在第3行、第9行定义了sum函数、main函数,其中sum函数的作用是计算两个整数的和。
  • 函数定义好后,并不会马上执行函数内部的代码,要有人调用它才会执行内部的代码。就好像你的手机虽然有打电话的功能,但是只有按了拨号键,才会执行打电话的功能。
  • 程序运行时就会先调用main函数,按顺序执行第11~14行代码,因为main函数是程序的入口
  • 第11行的sum(10, 11)是调用sum函数,sum函数被调用了,就会分配存储空间给形式参数列表中的所有参数,也就是第3行中的变量a和变量b,它们都是“形式参数”
  • 第11行中的10、11称为“实际参数”,它们将分别赋值给变量a、变量b,也就是相当于
int a = 10;
int b = 11;
  • 既然调用了sum函数,就会按顺序执行sum函数中的代码,也就是5~6行代码。
  • 第5行将a+b的值21赋值给了变量c,第6行使用return关键字将变量c返回给了函数调用者,也是说,第11行sum(10, 11)的值是21。那么变量d的值就是21。
  • 第13行的输出结果为
is 21
  • 第3~7行中的变量a、b、c都只有在调用sum函数时,才会分配存储空间,当sum函数执行完毕后,变量a、b、c就会被释放存储空间。因此,它们的作用域仅限于sum函数内部。
  • 第3行sum左边的int称为“返回值类型”,第6行return关键字后面跟着的数值称为“返回值”,因此第6行的变量c就是返回值,返回值的数据类型应该跟“返回值类型”保持一致。

三、形式参数和实际参数

1.基本概念

1>形式参数:在定义函数时,函数名后面的小括号()中定义的变量称为形式参数,简称形参
2> 实际参数:在调用函数时传入的值称为实际参数,简称实参 。。。。。。。。。。。。。。
2.**调用函数时传递的实参个数 必须和 函数的形参个数必须保持一致**
int sum(int a, int b, int c)
{
    return a + b + c;
}

int main()
{
    sum(10, 9, 7);
    return 0;
}

第1行中sum函数中有3个形参,因此在第8行调用sum函数时,需要传入3个实参

  1. 当使用基本数据类型(char、int 、float等)作为实参时,实参和形参之间只能是值传递,修改形参的值并不影响到实参
#include <stdio.h>

int test(char a)
{
    a = 10;
    
    return 0;
}

int main()
{
    char b = 5;
    
    test(b);
    
    printf("b的值是%d", b);
    
    return 0;
}
  • 在第3行定义了test函数,只有一个形参a
  • 在第14行调用了test函数,接着就会分配内存给变量a。这里将变量b当做实参,那么变量b的值将传递给变量a。这个时候,内存中大致如下图所示:
    在这里插入图片描述
    (其实在内存中存储的是二进制数据,这里我写成10进制是为了直观性)
  • 执行完第5行代码后,变量a的值变成了10,但是变量b的值依然是5
    在这里插入图片描述
  • 第16行代码的输出结果是:
b的值是5

因此,在函数内部修改了形参的值,并不会影响到外面的实参。
4.函数可以没有形参
定义一个函数时可以是没有形参的,比如下面的函数

#include <stdio.h>

int test()
{
    printf("调用了test函数");
    return 0;
}

int main()
{
    test();
    return 0;
}
  • 在第3行定义了test函数,可以发现,它的
  • 形参列表是空的,也就是没有形参
    那么在第11行调用test函数时,就不用传递任何实参
  • 其实,第9行定义的main函数也是没有形参的

四、返回值类型

  1. 返回值就是函数调用完后,返回给函数调用者的结果,用return关键字进行返回。定义函数时,要指明函数返回值类型
  2. 一个函数可以没有返回值,如果没有返回值,应该用void表示返回值类型
  3. 如果一个函数没有返回值,最后面的return语句可以省略
  4. 如果一个函数没有明确写出返回值类型,那么代表这个函数的返回值类型的时int

五、return

  1. return 语句可以在函数内部返回一个值给函数调用者
  2. 一个函数内部可以多次使用return 语句后,函数就会马上停止执行,return语句后面的代码就不再执行

六、函数的定义注意

  1. 函数名不能重复
  2. 每个函数都应该独立定义,不能嵌套定义

七、补充

  1. 在标准C语言中,函数的定义顺序是有讲究的,默认情况下,只有后面定义的函数才可以调用前面定义过的函数
  2. 如果想把其他函数的定义写在main函数后面,而且main函数能正常调用这些函数,那就必须在main函数前面作一下函数的声明
    在这里插入图片描述 在这里插入图片描述

详细请看:
https://mjios.cnblogs.com/archive/2013/06/08/3082932.html#toc_title_0
https://www.cnblogs.com/mjios/archive/2013/03/13/2957628.html
https://mjios.cnblogs.com/archive/2013/06/08/3093954.html#label0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值