安承悦读

c语言调用函数原则

admin
导读 _stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数。_cdecl 按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于传送参数的内存栈是由

c语言调用函数原则

_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数。_cdecl 按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数的函数只能使用该调用约定)是C和C++程序的默认调用约定。__cdecl调用约定仅在输出函数名前加上一个下划线前缀,格式为_functionname。_fastcall方式的函数采用寄存器传递参数,VC将函数编译后会在函数名前面加上"@"前缀...

一、C语言函数

1.概念:函数是一组一起执行一个任务的语句,每个c程序都必须有一个main函数,程序员可以把代码划分到不同的函数当中去,在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。c标准库提供了可以大量调用的库函数,比如,printf,strcmp等。

2.函数的定义

c语言中函数的一般定义如下:

return_type Function_name(Parameter List)

{

The function body

}

在c语言中,函数由一个函数头和一个函数主体组成,组成有以下方面:

函数名称:上面的函数名称即为max。

函数的返回类型:一个函数可以返回一个值,这里的max函数的返回值是一个int型的整数,函数也可以没有返回值,例如void max(),void代表该函数是一个没有返回值的函数。

注意函返回类型的值以该函数的返回类型一致,具体表现为:

函数的参数:当一个函数被调用时可以向该函数的参数传递一个值,这个值叫做实际参数,简称实参,函数的参数叫形式参数,简称形参。当然,一个函数也可以没有参数。

函数主体:其包括该函数里执行任务的语句,例子中的函数主体就是return a>b?a:b;

下面是一个定义一个比较大小函数的实例:

3.函数在定义时会有两种情况

在main函数之前定义,程序在这种情况下不需要再main函数里声明。

在main函数之后定义,这时需要在main函数里声明该函数,比如,声明Max函数时

int main()

{

int Max(int a,int b);

}

二、函数的调用

1.定义函数时会定义这个函数要做什么,然后通过调用该函数来完成定义的任务。当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。下面是一个具体调用函数的例子:

2.函数的嵌套调用与递归

函数的嵌套调用:简单来说就是在一个定义的函数里在调用另一个函数;

下面是一个比较三个数大小的例子:

函数的递归调用:递归是一种特殊的函数调用方式,简单来说就是在一个函数里再调用它自身为递归调用,函数递归会不断调用自己,每调用自己一次就进入新的一层,当最内层函数执行完后然后一层层向外退出。

以上可以看出递归的代码量比较少,但递归会占用较大的内存,而且运行时间长,所以如果不是什么特殊问题需要用递归解决尽量少用递归。

3.函数的传参

函数传递参数会有两种方式:

1.传值调用:该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。(该方式在函数内部不会改变实参的值),比如下面的例子可以说明这点:

在函数调用过程中,系统会为形参重新申请内存,函数调用完后形参会被释放掉。

2.引用调用:通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。