您的位置:首页 > 其它

关于指针的值与指针的指向

2009-09-07 16:13 225 查看
1, swap(p1,p2)
int *p1,*p2;
{
int p;
p=*p1;
*p1=*p2;
*p2=p;
}

2。 swap (p1,p2)
int *p1,*p2;
{

int *p;
p=p1;
p1=p2;
p2=p;
}

这两个函数1一个改变指向的值,2一个改变地址的值,
现在有点不是很清楚,2中改变了地址的值后,形参指向也改变了,为什么不改变实参的指向,为什么??1中改变了形参的指向,实参的指向就改变了,
能不能更清楚一点,我知道是单向的“值传递”方式,想知道为什么?

问题解析:

在函数内部并不会对p1和p2作任何的操作。。。
首先,编译器总是要为函数的每个参数制作临时副本,假设指针参数p1,p2的副本是 _p1,_p2,编译器使 _p1 = p1,_p2=p2。
然后,函数内部的代码:
第二个函数
{
int *p;
p=p1;
p1=p2;
p2=p;
}
实际上等于执行了:
{
int *p;
p=_p1;
_p1=_p2;
_p2=p;
}
因此p1和p2的指向根本没发生过变化。
而第一个函数相当于执行了
{
int p;
p=*_p1;
*_p1=*_p2;
*_p2=p;
}
由于p1和_p1,p2和_p2都是指向通一个内存地址,因此*_p1改变了,*p1也同样改变。
但要注意的是,两个函数当中实参p1和p2都没改变过指向,第一个函数改变的只是p1和p2他们指向的内存空间的值。

看一下以下的程序:
#include <iostream>
using namespace std;

void foo(int x)
{
x=3;
}

int main()
{
int x=5;
foo(x);
cout<<x<<endl;
}
x的值将是5而不会是3。
同样,2的swap函数被调用后,p1和p2的指向(也就是p1和p2的值)也不会改变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: