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条语句的小函数上,否则编译系统将该函数视为普通函数。
内联函数只能先定义后使用,否则编译系统也会把它认为是普通函数。 对内联函数不能进行异常的接口声明。
函数声明
函数声明和函数原型的参数名可以不一样,编译器他想知道的是函数参数的类型,与函数参数的名字没有关系
参数传递方式
- 值传递
#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原有的值。
- 指针传递
#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的数值。
- 引用传递
#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文件中使用引用传递会导致程序编译出错。