欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

深入理解C语言函数:关键知识点与实例解析

最编程 2024-08-08 15:20:45
...

C语言函数

一、结构化的程序设计

结构化程序设计的思想:把大问题分解成若干个小问题,每个小问题就是一个独立的子模块,以实现特定的功能、在C程序中,子模块的作用是由函数完成的.

  • 一个c源程序可以由多个文件构成(c文件的后缀名.c)
  • 一个源文件是一个编译单位
  • 一个源文件可以由若干个函数组成(函数是c程序的基本组成单位)
  • 每个c程序只能有一个main函数,其他都是子函数。
    主函数可以调用子函数,子函数可以相互多次调用。

如以下结构:
avatar

一个函数的定义

由如下组成

返回值 类型函数名字(形参列表)
{
     //函数体,函数的功能在函数体里实现
}

注意:

  • 函数名字是标识符,所以需要满足标识符的命名规则
  • 形参∶可以有,也可以没有,也可以有多个,但是即使没有,函数名字后面也必须加括号函数体上下位置必须有大括号
  • 如果要返回函数执行的结果,也就是返回值,则return后面跟的变量或者值,必须与函数名左边的返回值类型一致

二、函数的分类

1.按照定义分
1.1 标准函数

标准函数又称为库函数,由c系统提供,无需程序员定义,可直接使用,但需要在程序开头包含原型声明的头文件。如scanf()

1.2 自定义函数

由程序员根据自己的需求编写,自定义函数不仅要在程序中定义函数本身,必须还要在主函数中调用该函数

2. 按照有无返回值函数
2.1 有返回值函数

该类函数被调用执行完毕,将向调用者返回一个执行结果,称为函数的返回值

例如

 
int send( int a,int b)
{
return a+b;
}
 
void main()
{
z=send(a,b);
printf("%d\n",z);
 
}
2.2 无返回值函数

无返回值函数不需要向主调函数提供返回值

例如

 
void printstar()        
{
printf("************");
}
void main()
{
 
printsar();
}
}
3. 按照函数形式分类
3.1 无参函数

在函数的声明、定义和调用中均不带参数,特点:在调用无参函数主调函数并不将数据传输给被调用函数,此类函数通常被用来完成指定的功能,可以返回或不返回函数值。

/*
格式:
     类型说明  函数名()                                        
{                                                             
// 函数体                                                   
}                                                              
*/
int max()
{
// 函数体
}
 
 
空函数   无函数体
类型说明   函数名()
 {
//无函数体   因程序设计需要,确定模块需求   先占位置  后在补上
 }  
 
int max()
{
 
}
3.1 有参函数

在函数定义、声明都都有参数。特点:主调函数调用被调函数时,主调函数必须把值传输给形参,以供被调函数使用

 
int max(int a,int b)  // 有参函数
{
函数体
}
 

三、函数返回值及类型

例子1

/*
函数的定义
  函数类型  函数名([类型说明 变量名[,类型说明 变量名]])
  {
           函数体
	}
注意:函数与函数的关系是同等级别,不能嵌套
*/
 
#include "stdio.h"
int max(int a, int b)  // 有返回值  用参数的函数   a,b为形参
{
int c;
c=a>b?a:b;
return c;
}
 
void main()   // 无返回值必须加void声明,否则默认为int
{
 
int x,y;
printf("请输入两个整数:");
scanf("%d%d",&x,&y);
printf("%d和%d的最大值为:%d\n",x,y,max(x,y));
}
 
/*
return expression;    return a;
return(expression);   return (a);
*/

例子2

/*
函数的返回值是通过函数中的return语句实现
return语句将被调函数中的一个确定值带回主调函数中
编写cobe()函数用于计算x立方
*/
 
#include "stdio.h"
long cube(long x)        // 定义函数cube(),返回类型为long
{
long z;
z=x*x*x;
return z;                // 通过return返回所求结果,结果也应该为long
// x*x*x
}
 
void main()
{
long a,b;
printf("请输入一个整数:\n");
scanf("%ld",&a);
b=cube(a);
printf("%ld的立方为:%ld",a,b);
 
}

常见类型

int max()
double max()
void max()
float max()

四、函数调用方法

方法如下:

变量=函数名(实参列表);  //带返回值的
函数名(实参列表);   //不带返回值的

例子

#include <stdio.h>
//函数的声明,一般当子函数在主函数的下方时,需要在主函数的上方进行声明
void myfun1();
void myfun2(int a,int b);
int myfun3(int a,int b);

int main(int argc, char *argv[])
{
    //函数调用
    //没有参数也没有返回值
    //直接写函数名,并在后面加括号
    myfun1();

    //有参数,没有返回值
    //需要在函数名右边括号中传入参数,参数可以是常量表达式,也可容易时变量表达式
    myfun2(12,5);
    int x=10,y=49;
    //x,y:实参,实际参数,本质就是在函数调用时将实参的值传递给形参
    myfun2(x,y);

    //有参数也有返回值
    //可以使用一个变量接收函数执行结果(返回值),或者直接输出
    int n;
    n=myfun3(277,99);
    printf("%d\n",n);

    printf("sum=%d\n",myfun3(277,99));

    return 0;
}

void myfun1()
{

    printf("hello world\n");
    printf("nihao moshengren\n");
    printf("welcome to my house\n");


    return ;
}
//a,b:形参,形式参数,主要用于保存实数传递的值,本质跟实参没有任何关系,只是值传递
void myfun2(int a,int b)
{
    int sum;
    sum =a+b;

    printf("%d+%d=%d\n",a,b,sum);

}

int myfun3(int a,int b)
{
    int sum;
    sum =a+b;

    return sum;

}

五、总结

5.1 为什么要使用函数
  1. 定义一次,可以多次调用,减少代码的冗余度。
  2. 使咱们代码,模块化更好,方便调试程序,而且阅读方便
5.2 总结
  1. 定义函数的时候,关于函数的参数和返回值是什么情况,完全取决于函数的功能。当编写函数的时候,一开始不要想着函数如何传参和函数的返回值应该是什么而是当在编写代码的途中,要使用某些值,但是当前函数中不存在,此时就需要进行传参,这时候考虑怎么传参就是合适的时机

  2. 当函数编写完毕后,考虑是否要将某些结果返回给其他函数去使用,此时需要考虑返回值

推荐阅读