关于两个值互换的问题。求解释//用户自定义函数:void pm1(int *p1, int *p2){if(*p2 *p1) {int temp *p
关于两个值互换的问题。求解释
//用户自定义函数: 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) { if(*p2 > *p1) { int *p = p2; p2 = p1, p1 = p; } } 你改变了 p1 p2 的指向 不会影响实参的
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语言指针的书推荐一下? 最好有基础到深的那种。 c基础比较差,特别是指针。。。 现在要补c了/
C plus?
[解决办法] 其实这个问题跟指针无关,关键在于函数调用的时候进行一个copy的动作,这个copy的动作使得很多问题让人看起来匪夷所思。
[解决办法] 引用: 这个自己画个图理一下就清楚了。 pm1方法通过指针间接访问来交换各自指向的内存中的数据。 pm2方法交换了指针的指向,但内存中需要交换的数据没动 C和指针,C缺陷和陷阱,C专家编程,能看懂一点汇编最好。。。
[解决办法] 引用: 多谢楼上各位。。 还有个问题, int **i 这种是指什么?为什么两个*? 具体意义及作用是什么? 我看别人的源码,看到有这个定义 就是指针的指针。
i是一个指针,它指向的内容是一个指针。
当你需要对一个指针进行操作时,就可以通过传递指向它的一个指针来进行操作。