c语言函数定义和调用


一、函数概述

在c语言中,程序的结构是由函数组成,并且通过函数之间的调用来完成程序中的所有功能。
函数同变量一样,拥有存储类型 数据类型(包含特殊数据类型void)。此外函数定义还需要遵循特定格式。

二、函数定义

函数定义就是实现一个函数功能的程序块。
函数定义通常由函数头和函数体组成:
函数头:定义说明函数的存储类型及返回的数据类型、函数名、函数参数说明。
函数体:函数的实现语句及内部跳转语句。
函数定义如下格式所示:
<存储类型> <返回数据类型> 函数名 (<形式参数及说明>){
函数实现的详细功能(函数体);
}

函数的存储类型:分extern static 两种,当函数中未指定存储类型时,则为extern。extern类型可以被外部任何源文件调用。
函数的数据类型:可以是我们可以定义的任意数据类型,例:int char short long int double struct union 指针类型等。
函数的函数名定义:函数名的定义同c语言中变量定义的方式相同(在大型项目中,需要按照一定的规则定义名字,方便后续的维护)。
函数的形式参数:形式参数的组成:由参数类型和参数名组成;函数的形参个数可以为:大于等于零个任;参数类型可以是当前程序支持的任意数据类型,例:(int short double struct union 指针类型等)。
函数的函数体:函数体可以由大于等于零条执行语句;零条执行语句的函数我们称之为空函数。

注意事项:
函数体中不可以定义函数。


三、函数调用


3.1 函数执行

C语言中,函数从主函数main中进入,程序控制从当前函数移动到调用函数运行时,当遇见return或函数执行完毕后,程序才会返回至当前函数中继续执行。


3.2 函数申明

在程序中调用一个函数之前,应提供给系统该函数的相关信息(函数的存储类型 返回数据类型 函数名 形式参数) {当一个函数定义在使用后,需在使用前进行函数申明}


在一个函数中,调用另一个函数需具备以下条件:
3.2.1 被调用函数必须是已定义函数。
3.2.2 被调用函数的源文件必须采用#include 包含。例:当我们使用strcpy函数时,我们需要采用#include < string.h>
3.2.3 如果函数为用户自定义函数,可以将函数定义在调用函数的内部或外部,函数根据定义的位置来决定函数的可见性和使用范围。


3.3 函数调用时参数使用

函数调用参数注意事项:
3.3.1 实参数的个数和顺序必须同函数定义时保持一致。
3.3.2 实参数和形参数的数据类型必须保持一致。

3.4 函数调用方式

函数调用方式:
函数名(实参表)



3.4.1 函数调用语句

例:
void sleep1(unsigned int t); //函数原型
sleep1(5); //调用函数
此时函数无返回值,只需完成函数中的相关功能

3.4.2 函数表达式

例:
a = sum1(8,10); //将函数表达式求和,赋值给左边的表达式


3.4.3 函数作为一个参数

printf(“%d\n”,sum1(8,10)); //将函数的返回值作为另一个函数的参数。



四、参数数目可变的函数

在c语言中,可以定义参数数目可变的函数。
在定义参数数目可变的函数时,必须至少明确说明一个形参,在列出的最后一个形参后面用省略号来说明参数数目可变。
在调用参数可变的函数时,实参数目必须等于或大于形参表中说明的形参数目,实参和形参在次序上需一致。
例: printf scanf 函数都是参数可变函数
printf format [arguments …]

相关阅读:
c语言程序结构–函数
c 语言中 变量存储类型简介
linux c 数据存储类型
c auto存储类型
c 变量存储类型 -寄存器类型
c 语言存储类型之extern
c变量存储类型static