关于两个值互换的问题。求解释
//用户自定义函数:
void pm1(int *p1, int *p2)
{
if(*p2 > *p1) {
int temp = *p2;
*p2 = *p1;
*p1 = temp;
}
}
//另外:
void pm2(int *p1, int *p2)
{
if(*p2 > *p1) {
int *p = p2;
p2 = p1, p1 = p;
}
}
//以上两个函数
在main里调用
1:pmx(&i, &j)
2:pmx(p1,p2)//p1是指向i,p2是指向j的int指针
问题:
无论在main里用上面的两个方法去调用不同的用户函数,只有pm1才会实现i与j的交换。
而pm2则不会。
两个方法不同的地方就是 换值时,中间临时变量一个是int一个是指针。
为什么有这么大的差别呢??多谢
[解决办法]
void pm2(int *p1, int *p2)你改变了 p1 p2 的指向 不会影响实参的
{
if(*p2 > *p1) {
int *p = p2;
p2 = p1, p1 = p;
}
}
void pm1(int *p1, int *p2)
{
if(*p2 > *p1) {
int temp = *p2;
*p2 = *p1;
*p1 = temp;
}
}
你改变了*p1 和 *p2
这个*p1是main函数里面的一个对象 i
改变了*p1 改变的是i的值
*p2 同理
[解决办法]
这个自己画个图理一下就清楚了。
pm1方法通过指针间接访问来交换各自指向的内存中的数据。
pm2方法交换了指针的指向,但内存中需要交换的数据没动
[解决办法]
函数调用时,每个参数都有一份拷贝,而你调第二个函数,连指针都没有达到交换指向的目的。
所以你要想用第二个实现,可以用int **作为参数。
[解决办法]
pm2实际上交换的是形参p1和p2两个指针对于实参没有影响。
void pm3(int p1, int p2)
{
if(p2 > p1) {
int temp = p2;
p2 = p1;
p1 = temp;
}
}
这个函数不能实现交换的原因我想你应该明白。
其实pm2和pm3不能交换的原因是一样的道理。
举个例子:
int *m1=1;
int *m2=2;
当执行pm2(m1,m2)时,实际上相当于
int *p1=m1;
int *p2=m2;
p1和p2换了,只是p1现在指向2的地址,p2现在指向1的地址
但是m1仍然指向1的地址,m2仍然指向2的地址。
[解决办法]
C plus?
[解决办法]
其实这个问题跟指针无关,关键在于函数调用的时候进行一个copy的动作,这个copy的动作使得很多问题让人看起来匪夷所思。
[解决办法]
C和指针,C缺陷和陷阱,C专家编程,能看懂一点汇编最好。。。
[解决办法]
就是指针的指针。
i是一个指针,它指向的内容是一个指针。
当你需要对一个指针进行操作时,就可以通过传递指向它的一个指针来进行操作。