标签:
C语言中函数的参数传递方式有两种:传值、传地址。
1.传值调用
在被调用函数中开辟出一个临时的内存空间,在主调用函数进入被调用函数前,会将实参进行拷贝,拷贝的数据放在该临时内存空间中,供被调用函数使用。当被调用函数返回时,该临时内存空间即被释放。
1 #include<stdio.h> 2 3 int test_func(char *q) 4 { 5 long lAddr=&q; // 被调用时,光标选中“&q”,显示结果(随机)为:0x002df7ac {0x013058b8 "world"}, 6 q="Hello"; // 即此时,q的地址“&q”为:0x002df7ac,而q本身指向:0x013058b8 "world",与实参p指向相同。 7 return 0;
8 } 9 10 void main(void) 11 { 12 char *p="world"; 13 long lAddr=&p; // 断点时选中“&p”,显示:0x002df88c {0x013058b8 "world"}, 14 test_func(p); // 即此时p的地址“&p”为:0x002df88c,而p本身指向:0x013058b8 "world" 15 16 printf("%s\n"); // 最终输出为“world” 17 }
2.传地址调用
把主调用函数中开辟的某个内存空间的(首)地址传递给被调用函数,被调用函数可以读写该内存空间。当被调用函数返回后,该内存空间仍然存在,主调用函数会继续使用它。
1 #include<stdio.h>
2
3 int test_func(int *x,int *y) // 被调用时, 光标选中“x”,显示(随机):0x0039f934 {3};选中“y”,显示:0x0039f928 {9}
4 {
5 int temp;
6
7 temp=*x;
8 *x=*y; // 这里,内存地址未发生变化,但其中的值进行了交换。
9 *y=temp;
10
11 return 0;
12 }
13
14 int main(void)
15 {
16 int x=3;
17 int y=9;
18
19 printf("x=%d,y=%d\n",x,y); // x=3,y=9
20 test_func(&x,&y); // 断点时,光标选中“&x”,显示(随机):0x0039f934 {3};选中“&y”,显示:0x0039f928 {9}
21 printf("x=%d,y=%d\n",x,y); // x=9,y=3
22
23 return 0;
24 }
http://zhidao.baidu.com/link?url=4BPJ44dGW_2ok9hDUWIOW9SRHhWpYXb7YTyBzuip8LzYgAFuHHEHeAgMn5JhgpgRkBXKXg6lmN4c5IesfDMv5K
标签:
原文地址:http://www.cnblogs.com/tianlang358/p/4910065.html