C/C++中的函数参数传递机制(转载)
一、 函数参数传递机制的基本理论 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。以下讨论称调用其他函数的函数为主调函数,被调用的函数为被调函数。 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。 引用传递(pass-by-reference)过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
二、 C语言中的函数参数传递机制 在C语言中,值传递是唯一可用的参数传递机制。但是据笔者所知,由于受指针变量作为函数参数的影响,有许多朋友还认为这种情况是引用传递。这是错误的。请看下面的代码: int swap(int *x, int *y) { int temp; temp = *x; *x = *y; *y = temp; return temp; } void main() { int a = 1, b = 2; int *p1 = &a; int *p2 = &b; swap(p1, p2) } 函数swap以两个指针变量作为参数,当main()调用swap时,是以值传递的方式将指针变量p1、p2的值(也就是变量a、b的地址)放在了swap在堆栈中为形式参数x、y开辟的内存单元中。这一点从以下的汇编代码可以看出(注释是笔者加的): 22: void main() 23: { …… …… 13: int a = 1, b = 2; 00401088 mov dword ptr [ebp-4],1 0040108F mov dword ptr [ebp-8],2 14: int *p1 = &a; 00401096 lea eax,[ebp-4] 00401099 mov dword ptr [ebp-0Ch],eax 15: int *p2 = &b; 0040109C lea ecx,[ebp-8] 0040109F mov dword ptr [ebp-10h],ecx 16: swap(p1, p2); 004010A2 mov edx,dword ptr [ebp-10h] ;参数p2的值进栈 004010A5 push edx 004010A6 mov eax,dword ptr [ebp-0Ch] ;参数p1的值进栈 004010A9 push eax 004010AA call @ILT+15(swap) (00401014) ;调用swap函数 004010AF add esp,8 ;清理堆栈中的参数 17: } 阅读上述代码要注意,INTEL8
相关文档:
最近一个朋友准备把C代码在ECLIPSE上编译,以前一直搞的JAVA,也知道ECLIPSE支持C工程,但是自己从来没搞过,所以就自己先从网络上找资料,主要方法如下
1、安装JDK和Eclipse
这里就不多说,具体请见:http://blog.chinaunix.net/u/16292/showart_223309.html
我的安装环境是jdk1.5,eclipse3.2.1
2、安装C++的E ......
通常,在C语言的头文件中经常可以看到类似下面这种形式的代码:
#ifdef __cplusplus
extern "C" {
#endif
/**** some declaration or so *****/
#ifdef __cplusplus
}
#endif /* end of __cplusplus */
那么,这种写法什么用呢?实际上,这是为了让CPP能够与C接口而采用的一种语法形式。之所以采用这种方式 ......
VC中下面几个结构体大小分别是多少呢
struct MyStruct
{
double m4;
char m1;
int m3;
};
struct MyStruct {
char m1;
double m4;
int m3;
};
#pragma pack(push)   ......