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,无符号长整型)
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。