2016 - 2024

感恩一路有你

c语言怎么调用函数里的参数(c语言函数调用规则?)

浏览量:3201 时间:2023-01-15 16:30:38 作者:采采

c语言怎么调用函数里的参数(c语言函数调用规则?)

c语言函数调用传参方式?

C语言中函数参数传递的三种方式

(1)传值就是把你的变量的值传递给函数的形参,实际上就是用变量的值生成一个新的形参,所以函数内形参的变化不会影响函数外变量的值。

(2)地址转移是指将被转移变量的地址赋给函数中形参的指针,使指针指向实变量的地址,因为指针所指地址内容的变化可以在函数外部反映出来,即函数外部变量的值可以改变。

(3)引用实际上是通过指针来实现的,指针可以达到使用的效果,比如寻址,但是使用了传值等方法。

c语言调用函数写法?

在C语言中,函数调用的一般形式是:函数名(实参表)在调用非参数函数时没有实参表。实际参数表中的参数可以是常量、变量或其他结构类型的数据和表达式。参数用逗号分隔。

# includeltstdio.hgt

Int fun(int x,int y) //函数声明,如果函数写在被调用的地方之前,就没必要声明了。

void main()

{

int a=1,b=2,c

C=fun(a,b) //调用函数,调用用户自定义函数fun,其中A和B为实际参数和传递给被调用函数的输入值。

}

//用户自定义函数fun

Int fun(int x,int y) //函数头

{/{}中的语言是函数体。

返回xgty?X : y //返回x和y中较大的数。

}

函数自变量

该函数作为另一个函数调用的实际参数出现。在这种情况下,函数的返回值作为参数传输,因此函数必须有返回值。比如printf(#34%d#34,max(x,y))使用max调用的返回值作为printf函数的参数。函数调用中另一个需要注意的问题是求值顺序。

所谓求值顺序,是指参数表中的量是从左到右使用还是从右到左使用。在这方面,每个制度的规定不一定相同。在介绍printf函数的时候已经提到了,这里从函数调用的角度来强调。

c语言函数调用规则?

在参数传递中,有两个重要问题必须明确说明:

1.当参数个数大于1时,参数按什么顺序推入堆栈;

2.函数调用后谁来恢复堆栈?

在高级语言中,这两个问题都是通过函数调用的方式来解释的。常见的调用方法有:

stdcall cdecl fast call this call this call裸调用

以下是一些打电话的方法:

1.stdcall

Stdcall调用模式也叫Pascal调用模式。在微软C系列的C/C编译器中,使用PASCAL宏、WINAPI宏和CALLBACK宏来指定函数调用为stdcall。

stdcall模式的函数声明是:

int _stdcall函数(int a,int b)

调用stdcall的方式意味着:

(1)参数从右向左一次性推入堆栈。

(2)被调用的函数恢复堆栈本身。

(3)函数名自动加下划线,后面跟一个@,后面跟参数大小。

将上述函数翻译成汇编语言将变成:

按b先按第二个参数。

按a,然后按第一个参数。

调用函数

在编译时,这个函数的名字被翻译成_function@8。

2.cdecl

Cdecl调用模式,也称为C调用模式,是C语言的默认调用模式,其语法为:

Int function(int a,int b) //不带修饰符,是C调用方法。

Int _cdecl function(int a,int b) //在c中显式指定调用方法。

调用cdecl的方式决定了:

(1)参数从右到左依次推入堆栈。

(2)调用方恢复堆栈

(3)函数名自动用前导线加下划线。

因为调用者还原堆栈,所以C调用方法所允许的函数的参数个数是不固定的,这是C语言的一大特点。

这种方式下的函数翻译为:

按b //先按第二个参数。

按a //输入第一个参数。

调用函数//调用函数

添加esp,8 //清除堆栈

在编译时,这种方式的函数被翻译为:_function。

3.快速呼叫

Fastcall是一种快速调用方法,从名字就可以知道。以这种方式传递函数的第一和第二DWORD参数通过ecx和edx,

后续参数从右到左被推送到堆栈上。

被调用的函数清除堆栈。

为函数名制定一个规则,和stdcall一样。

它的声明语法是:

int快速调用函数(int a,int b)

4.这通电话

Thiscall调用方法是唯一不能显示指定修饰符的方法。它是C类成员函数的默认调用方法。因为成员函数调用也有一个this指针,所以必须使用这个特殊的调用方法。

该呼叫意味着:

参数从右向左推入堆栈。

如果参数个数确定,这个指针通过ecx传递给被调用者;如果参数的数量不确定,则在所有参数都被推送到堆栈上之后,将该指针推送到堆栈上。

如果参数个数不确定,调用者会清空堆栈,否则函数会自己清空堆栈。

可以看出,对于固定数目的参数,它类似于stdcall,对于不规则数目,它类似于cdecl。

5.裸呼

是一种比较少见的调用方法,在一般的高级编程语言中并不常见。

函数声明的调用方法必须与实际调用方法一致,这必然会导致编译器的混乱。

函数名修改规则:

1.c编译时函数名修饰约定规则:

__stdcall调用约定在输出函数名前添加一个下划线前缀,后跟一个“@”符号及其参数的字节数,格式为_function@8。

__cdecl调用约定只在_function格式的输出函数名前添加一个下划线前缀。

__fastcall约定在输出函数名前添加一个“@”符号,后跟一个“@”符号及其参数的字节数,格式为@function@8。

它们不改变输出函数名中字符的大小写,这与PASCAL调用约定不同,PASCAL调用约定输出函数名不做任何修改,全部大写。

2.c编译时函数名修饰约定规则:

__stdcall调用约定:

(1)使用“?”标识函数名的开头,后跟函数名;

(2)函数名后面加“@@YG”标识参数表的开头,后面加参数表;

(3)参数表用代码表示:

X - void,

d字符,

电子无符号字符,

F - short,

H - int,

I -无符号整数,

j龙,

K -无符号长整型,

m浮动,

n倍,

_N - bool,

.

PA -表示指针,后面的代码表示指针类型。如果同类型的指针连续出现,就会被“0”代替,一个“0”代。

表格重复一次;

(4)参数列表中第一项是函数的返回值类型,后面是参数的数据类型,指针在它所引用的数据类型之前标识;

(5)在参数表后用“@Z”标记整个名称的结尾。如果函数没有参数,用“z”标记。

它的格式是“?function name @ @ YG * * * * * @ Z yg * * * * @ Z quot; or quot;Functionname@@YG*XZ”,例如

int Test1(char *var1,无符号长整型)

函数 参数 方法 调用 函数调用

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。