C语言函数

2018/01/29 C 共 1708 字,约 5 分钟

C语言复习

内部函数

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

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

例如,函数的首行:

tatic int max(int a,int b)

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

外部函数

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

如函数首部可以为

extern int max (int a,int b)

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

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

内联函数

  • 内联函数不能是虚函数 如果修饰内联函数 如果内联函数被virtual修饰,计算机会忽略inline使它变成存粹的虚函数。
  • 静态成员函数不能是虚函数 static成员函数是和类同生共处的,他不属于任何对象,使用virtual也将导致错误。

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

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

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

递归函数不能定义为内联函数

内联函数一般适合于不存在while和switch等复杂的结构且只有1~5条语句的小函数上,否则编译系统将该函数视为普通函数。

内联函数只能先定义后使用,否则编译系统也会把它认为是普通函数。 对内联函数不能进行异常的接口声明。

函数声明

函数声明和函数原型的参数名可以不一样,编译器他想知道的是函数参数的类型,与函数参数的名字没有关系

参数传递方式

  1. 值传递
     #include <stdio.h>
    
     void swap(int x, int y);
     void swap(int x, int y)
     {
         int temp;
         temp = x;
         x = y;
         y = temp;
     }
    
     int main( int argc, char *argv[] )
     {
         int a = 5;
         int b = 10;
         swap(a, b); //调用交换函数
         printf("交换结果为 a = %d, b = %d\n",a,b);
         return 0;
     }
    

由于值传递是单向传递,传递过程中只是改变了形参的数值,并未改变实参的数值,因此并不会改变a和b原有的值。

  1. 指针传递
    
     #include <stdio.h>
    
     void swap(int *x, int *y);
     void swap(int *x, int *y)
     {
         int temp;
         temp = *x;
         *x = *y;
         *y = temp;
     }
    
     int main( int argc, char *argv[] )
     {
         int a = 5;
         int b = 10;
         swap(&a, &b); //调用交换函数
         printf("交换结果为 a = %d, b = %d\n",a,b);
         return 0;
     }
    

指针传递过程中,将a和b的地址分别传递给了x和y,在函数体内部改变了a、b所在地址的值,即交换了a、b的数值。

  1. 引用传递
    
     #include <stdio.h>
    
     void swap(int &x, int &y);
     void swap(int &x, int &y)
     {
         int temp;
         temp = x;
         x = y;
         y = temp;
     }
    
     int main( int argc, char *argv[] )
     {
         int a = 5;
         int b = 10;
         swap(a, b); //调用交换函数
         printf("交换结果为 a = %d, b = %d\n",a,b);
         return 0;
     }
    

引用传递中,在调用swap(a, b);时函数会用a、b分别代替x、y,即x、y分别引用了a、b变量,这样函数体中实际参与运算的其实就是实参a、b本身,因此也能达到交换数值的目的。

注:严格来说,C语言中是没有引用传递,这是C++中语言特性,因此在.c文件中使用引用传递会导致程序编译出错。

Search

    Table of Contents