C语言--函数

C 函数

函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。

您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。

函数定义

C 语言中的函数定义的一般形式如下:

return_type function_name( parameter list )    //函数签名
{
   body of the function      //函数体(具体实现)
}

在 C 语言中,函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分:

  • 返回类型:一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是 void
  • 函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名
  • 参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
  • 函数主体:函数主体包含一组定义函数执行任务的语句。

实例

以下是 max() 函数的源代码。该函数有两个参数 num1 和 num2,会返回这两个数中较大的那个数:

/* 函数返回两个数中较大的那个数 */
 int max(int num1, int num2) 
    { 
        /* 局部变量声明 */ 
        int result;
         if (num1 > num2) 
            { result = num1; } 
        else 
            { result = num2; } 
        return result;
     }

函数声明

函数声明会告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。

函数声明包括以下几个部分:

return_type function_name( parameter list );

针对上面定义的函数 max(),以下是函数声明:

int max(int num1, int num2);

在函数声明中,参数的名称并不重要,只有参数的类型是必需的,因此下面也是有效的声明:

int max(int, int);

当您在一个源文件中定义函数且在另一个文件中调用函数时,函数声明是必需的。在这种情况下,您应该在调用函数的文件顶部声明函数。函数声明和函数原型的参数名可以不一样,编译器他想知道的是函数参数的类型,与函数参数的名字没有关系。

函数参数

如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数

形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。

当调用函数时,有两种向函数传递参数的方式:

调用类型描述
传值调用该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。
引用调用通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。
指针传递指针传递过程中,将a和b的地址分别传递给了x和y,在函数体内部改变了a、b所在地址的值,即交换了a、b的数值。

默认情况下,C 使用传值调用来传递参数。一般来说,这意味着函数内的代码不能改变用于调用函数的实际参数。

根据函数能否被其他源文件调用,将函数区分为内部函数和外部函数。

内部函数

如果一个函数只能被本文件中其他函数所调用,它称为内部函数。在定义内部函数时,在函数名和函数类型的前面加 static,即

static 类型名 函数名 (形参表)

例如,函数的首行:

static int max(int a,int b)

内部函数又称静态函数。使用内部函数,可以使函数的作用域只局限于所在文件。即使在不同的文件中有同名的内部函数,也互不干扰。提高了程序的可靠性。

外部函数

如果在定义函数时,在函数的首部的最左端加关键字 extern,则此函数是外部函数,可供其它文件调用。

如函数首部可以为

extern int max (int a,int b)

C 语言规定,如果在定义函数时省略 extern,则默认为外部函数。

在需要调用此函数的其他文件中,需要对此函数作声明(不要忘记,即使在本文件中调用一个函数,也要用函数原型来声明)。在对此函数作声明时,要加关键字 extern,表示该函数是在其他文件中定义的外部函数。

内联函数

内联函数是指用inline关键字修饰的函数。在类内定义的函数被默认成内联函数。内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。

内联扩展是用来消除函数调用时的时间开销。它通常用于频繁执行的函数,对于小内存空间的函数非常受益。

使用内联函数的时候要注意:

  • 递归函数不能定义为内联函数
  • 内联函数一般适合于不存在while和switch等复杂的结构且只有1~5条语句的小函数上,否则编译系统将该函数视为普通函数。
  • 内联函数只能先定义后使用,否则编译系统也会把它认为是普通函数。
  • 对内联函数不能进行异常的接口声明。

关于 main 函数的参数

在有些很专业的书会看到如下代码

int main( int argc, char *argv[] )

上面的代码中 main 函数带了参数。

但是有时又会看见main函数没有参数,如下:

int main()

那么 main 函数到底有没有参数,有没有参数会不会有什么影响?

main 函数其实与我们写的函数没有什么区别,它也会有自己的参数。

argc 和 argv 是 main 函数的形式参数。

这两个形式参数的类型是系统规定的。如果 main 函数要带参数,就是这两个类型的参数;否则main函数就没有参数。

变量名称argc和argv是常规的名称,当然也可以换成其他名称。在传入参数后main函数收到参数后就会做自己的事。那么,实际参数是如何传递给main函数的argc和argv的呢?我们知道,C程序在编译和链接后,都生成一个exe文件,执行该exe文件时,可以直接执行;也可以在命令行下带参数执行,命令行执行的形式为:可执行文件名称 参数1 参数2 ... ... 参数n。可执行文件名称和参数、参数之间均使用空格隔开。

如果按照这种方法执行,命令行字符串将作为实际参数传递给main函数。具体为:

  •  (1) 可执行文件名称和所有参数的个数之和传递给 argc;
  •  (2) 可执行文件名称(包括路径名称)作为一个字符串,首地址被赋给 argv[0],参数1也作为一个字符串,首地址被赋给 argv[1],... ...依次类推。

补充

占位符就是先占住一个固定的位置,等着你再往里面添加内容的符号,广泛用于计算机中各类文档的编辑。

格式占位符(%)是在C/C++语言中格式输入函数,如 scanf、printf 等函数中使用。其意义就是起到格式占位的意思,表示在该位置有输入或者输出。

  •  %d, %i 代表整数
  •  %f 浮点
  •  %s 字符串
  •  %c char
  •  %p 指针
  •  %fL 长log
  •  %e 科学计数
  •  %g 小数或科学计数。
  •  %a,%A 读入一个浮点值(仅C99有效)。
  •  %c 读入一个字符。
  •  %d 读入十进制整数。
  •  %i 读入十进制,八进制,十六进制整数。
  •  %o 读入八进制整数。
  •  %x,%X 读入十六进制整数。
  •  %s 读入一个字符串,遇空格、制表符或换行符结束。
  •  %f,%F,%e,%E,%g,%G 用来输入实数,可以用小数形式或指数形式输入。
  •  %p 读入一个指针。
  •  %u 读入一个无符号十进制整数。
  •  %n 至此已读入值的等价字符数。
  •  %[ ] 扫描字符集合。
  •  %% 读 % 符号
  • 31
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值