一个函数传递的简单有关问题
一个函数传递的简单问题
为什么输出时3 5
不是5 3
是个很简单的问题
但是就是这个函数传递的问题我就是搞不清楚~~~~
------解决方案--------------------
- C/C++ code
#include<stdio.h> void swap(int *a,int *b) { int *t; t=a;a=b;b=t; } main() { int i=3,j=5,*p=&i,*q=&j; swap(p,q); printf("%d %d",*p,*q); }
为什么输出时3 5
不是5 3
是个很简单的问题
但是就是这个函数传递的问题我就是搞不清楚~~~~
------解决方案--------------------
- C/C++ code
void swap(int *a,int *b) { int *t; t=a;a=b;b=t; } 改成 void swap(int *a,int *b) { int t; t=*a;*a=*b;*b=t; }
------解决方案--------------------
楼上正解;其实还是指针概念的问题;
如果在一个函数中想使用如参来对其进行改变,
就需要这个类型的指针;
使用的时候不能把其当成指针的值来使用,
而是要当成地址,对其进行 *的访问;
才能有效的改变其内容。
------解决方案--------------------
int *t;
t=a;a=b;b=t;
上面的是交换局部变量的指针
int t;
t=*a;*a=*b;*b=t;
这里交换的是指针指向的值。
再回去认真看一下书。
------解决方案--------------------
退出函数SWAP后,形参就失效了
------解决方案--------------------
- C/C++ code
#include<stdio.h> void swap(int *a,int *b) { int *t; /* t=a;a=b;b=t; */ /* 上面那句错了,*指针变量表示的才是指针指向的单元, *楼主想给这个单元赋值就得用*指针=数据;改为一下代码就ok了 */ *t = *a;*a = *b;*b = *t; } main() { int i=3,j=5,*p=&i,*q=&j; swap(p,q); printf("%d %d",*p,*q); }
------解决方案--------------------
我想LZ的本来意思是想交换两个指针吧?
不过貌似传递形参只是传递了一份形参的Copy,Swap并没有真正改变p和q。
不妨尝试一下传递引用吧。
------解决方案--------------------
引用简单点
- C/C++ code
void swap(int &a,int &b) { int t; t = a; a = b; b = t; }
------解决方案--------------------
t=a;a=b;b=t;
编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,所以这样你只是修改了副本的内容,
t=*a;*a=*b;*b=t;
这样才能修改指针指向的值!
------解决方案--------------------
main里调用swap(p,q)时,将p和q的值的拷贝传给了swap里的变量a和b,
在swap中a和b的值发生了变化,但p和b并未发生变化。
注意:这里说的p和q的值,是p和q这个指针本身的值,并不是它们所指向的变量的值,
p和q本身也是一个变量。
可以将swap改成如下形式:
void swap(int** a, int** b)
{
int** t;
t=a;
a=b;
b=t;
}
main中调用:swap(&p, &q);
------解决方案--------------------
- C/C++ code
#include<stdio.h> void swap(int *a,int *b) { int *t; t=a;a=b;b=t; //你这其实交换的副本的地址指向,这对实参没有任何的改变 //把上面改成int t;t=*a;*a=*b;*b=t;这就行了,这样改变了内存上的内容,导致了实参也改变 } main() { int i=3,j=5,*p=&i,*q=&j; swap(p,q); printf("%d %d",*p,*q); }