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
时间: 2024-08-05 11:16:02