指针变量 参数函数 值传递 的问题

“不能通过调用函数来改变实参指针变量的值,但可以改变实参指针所指变量的值”
谭浩强的10.3 和10.4前面那个题 关于交换大小的
调用函数是下面的
{p=p1;p1=p2;p2=p;} 还有{p=*p1;*p1=*p2;*p2=p;}这两种情况搞不清楚,谢谢啦

为什么用指针变量作为函数参数就可以?
不用指针变量, 实参 值传递 的方式单向传到 形参, 那么只改变调用函数里的值,没有回传到实参来,
那么,用了指针变量, 值是怎么到实参来的?

首先你要知道C语言编译器系统是根据内存地址对内存中的数据进行的操作的,比如:int i=1,j=2;那么i和j在内存中有自己相应的内存地址,系统执行i+j时,系统会根据i,j的内存地址找到i,j内存中的数值,再进行运算的,所以上面的问题就是这样一个样子,{p=p1;p1=p2;p2=p;}
这是一个内存中的值交换,{p=*p1;*p1=*p2;*p2=p;},而这是内存地址的一个交换。就像我们要进一件房间找东西,我们得知道门牌号吧,内存地址就可以理解成门牌号,你要交换房间的东西有两种办法:
1,直接交换东西,即A房间的东西放B房间,B房间东西放A房间。
2,还有就是交换门牌号。
这样做的意义就是当数据不好移动的时候,就如两个房间有很多东西,是不是交换门牌号来得更直接,更快?
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-07-22
用户函数中使用的是局部变量,将主函数中的变量通过传值赋给用户函数中的局部变量,交换变量值改变的只是局部变量的值,主函数中变量值没被交换,但如果是将地址作为参数传入,用户函数改变的是内存中指针的指向,指向交换了,主函数中的指针指向也就改变了
指针实际上是一个内存地址,用指针传入实际上是改变了内存中存储的内容,是直接对计算机内存进行操作追问

改变了指向,那他怎么传递到主函数呢,谢谢啦

追答

指针实际上是一个内存地址,用指针传入实际上是改变了内存中存储的内容,是直接对计算机内存进行操作,将内存中存储的内容进行了改变
刚才没打完

第2个回答  2011-07-25
可以从作用域理解形参为什么不能进行值传递:
形参它的作用范围只在定义的子函数内,程序跳出子函数,形参就消失
也就是形参在子函数定义时,在内存中临时开辟空间储存这个形参。一旦跳出这个子函数,形参就不存在。
而指针,你可以理解为指向内存中物理地址,通过指针,就能访问指针所指向内存的物理地址中的内容。
第3个回答  2011-07-23
对指针变量的加减只能改变位置不能直接改变其所在地址的值。
第4个回答  2011-07-22
注意传递地址和传递变量的区别:
比如
void swap(int x,int y)
{
//...
}
...
int a=3,b=4;
swap(a,b);
此处将变量a的值3传递给x,b的值4传递给y,此后再swap函数中便与ab无关了,xy再怎么改变,ab都不会变的
其实传地址的道理是一样的,不过要区别的是:地址没变,地址里面的内容变了
比如
void swap(int *p1,int *p2)
{
*p1=5;*p2=6;
}
...
int a=3,b=4;
int *pa=&a,*pb=&b;
swap(pa,pb);
注意此处将ab的地址传递给了形参p1,p2,而在swap中是通过地址改变了参数的值,我们假定变量a在内存中的地址是2000,变量b在内存中的地址是3000,将2000和3000分别传递给p1,p2,然后*p1=5;通过p1指针内的地址改变了里面的值,也就是将内存地址2000里面的内容改为5,又将内存3000里面的内容改为了6,然后返回主函数后,这时pa,pb的指向并没有改变,pa仍指向a,pb仍指向b,但是ab里面的内容则发生了改变
这边再仔细推敲一下吧,希望对你有帮助本回答被提问者采纳
相似回答