指针问题不懂!本帖最后由 chenlianghx 于 2013-12-19 23:18:39 编辑#includestdio.hvoid main(){void sw
指针问题不懂!
本帖最后由 chenlianghx 于 2013-12-19 23:18:39 编辑
#include<stdio.h>
void main()
{
void swap(int *p1,int *p2);
int a,b;
int *p1,*p2;
scanf("%d,%d",&a,&b);
p1=&a;
p2=&b;
if(a<b)
swap(p1,p2);
printf("%d,%d\n",*p1,*p2);
}
void swap(int *p1,int *p2)
{
int t;
t=*p1;
*p1=*p2;
*p2=t;
}
请问这个程序中的swap函数体为什么不能改成:
void swap(int *p1,int *p2)
{
int *t;
t=p1;
p1=p2;
p2=t;
}
书上说是函数体的值改变并未影响到主函数,可为什么改变了函数体中的指针变量所对应的值,就行呢?
[解决办法]楼主,看来你是初学者,没有理解好函数调用的形参与实参的含义。
记住并理解一句话:“要在调用函数中修改主函数的变量的值就一定要传递变量的指针”。
首先要搞清楚:
一:
void swap(int a,int b)
{
int t;
t = a;
a = b;
b = a;
}
swap(a, b);
此函数不能交换变量a,b的值。
二:
void swap(int *p1,int *p2)
{
int t;
t = *p1;
*p1 = *p2;
*p2 = t;
}
此函数能改变原函数中变量a,b的值,因为传递的是a,b的指针(地址)
三:
你的这个函数:
void swap(int *p1,int *p2)
{
int *t;
t=p1;
p1=p2;
p2=t;
}
我知道你意在交换指针变量p1,p2的值,但是它无法改变原函数中的p1,p2的值。
因为,原函数的p1,p2与被调函数的p1,p2是完全不同的,是互不影响的。
你交换了swap函数中p1,p2的值,是不会改变主函数中的p1,p2的值的。
要改变原函数的p1,p2的值,就必须传递p1,p2的指针。所谓指针的指针,其实就是指针变量的指针(地址)。
可以这样子改:
#include<stdio.h>
void main()
{
void swap(int **p1,int **p2);
int a,b;
int *p1,*p2;
scanf("%d,%d",&a,&b);
p1=&a;
p2=&b;
if(a<b)
swap(&p1, &p2);
printf("%d,%d\n",*p1,*p2);
}
void swap(int **p1,int **p2)
{
int *t;
t = *p1;
*p1 = *p2;
*p2 = t;
}
当然这个程序实际意义不大,只是能让你更清楚地理解指针与指针变量的概念,以及函数调用的知识。
变量就是一段内存单元,变量的指针就是其内存单元的地址。
所以,任何一个变量都有指针,指针变量也有指针。
要想在被调函数修改主调函数中的变量的值,就必须传递变量的指针。
[解决办法]void swap(int *p1,int *p2)
{
int *t;
t=p1;
p1=p2;
p2=t;
}
这样更改的只是形参p1,p2的值,而不是p1,p2指向的变量的值。
因此这样在函数调用结束后,子函数栈帧数据被销毁。主函数栈帧将a,b地址弹出栈后,a,b的内容也没有改变。
而
void swap(int *p1,int *p2)
{
int t;
t=*p1;
*p1=*p2;
*p2=t;
}
改变的是p1,p2指向单元的值,因此在主函数栈帧将a,b的地址弹出后,a,b的值发生了交换。