c语言有个指针问题。我弄不懂

#include<stdio.h>voidmain(){voidswap(int*,int*);int*p1,*p2,*p3;inta,b,c;printf("Pleas... #include<stdio.h>
void main()
{
void swap(int *,int *);
int *p1,*p2,*p3;
int a,b,c;
printf("Please input three number:\n");
scanf("%d%d%d",&a,&b,&c);
p1=&a;
p2=&b;
p3=&c;
if(a>b)
swap(p1,p2);
if(a>c)
swap(p1,p3);
if(b>c)
swap(p2,p3);
printf("%d,%d,%d",a,b,c);
getch();
}
void swap(int *p1,int *p2)
{
int p;
p=*p1;
*p1=*p2;
*p2=p;
}

当执行到
if(b>c)
swap(p2,p3); 时,
是跳到
void swap(int *p1,int *p2)
这个模块中,但再执行下面时
{
int p;
p=*p1;
*p1=*p2;
*p2=p;
}
有指针P1和P2的调换,但没有P3,那本身C的位置在P3它是怎么换的?
展开
 我来答
百度网友2a208e92a
2011-01-25 · TA获得超过452个赞
知道小有建树答主
回答量:198
采纳率:0%
帮助的人:214万
展开全部
void swap(int *p1,int *p2)
当你调用这个函数时,如:swap(p2,p3);
实际上相当于 发生了如下初始化 int *p1=p2 , int *p2=p3;
这样 函数里面的p1,p2,的值就是p2,p3,的值了。而指针是间接访问的这个知道吧。
那么在函数里面用p2访问数据,和在主函数里面用p3访问数据,结果是一样的。
因为p2和p3指向同一个地址。
另外说一下变量的作用域问题。解释一下,所谓作用域就是变量有用的区域,也就是说,变量在这个区域内是有用的,在这个区域外是不能用的,也就是没有这个变量
简单点说,就是你在某一个函数里面创建的变量只能在函数里面用,也就是说,如果你在主函数里面定义了 p1 p2,这两个变量就只能用于主函数,在其它函数里面不能用,如果用了的话,编译器就会提醒你没有定义这个变量。
同理,你上面的主函数、排序函数里面都定义了两个同名的指针变量 p1 p2,主函数里的p1 p2和排序函数里的p1 p2分别是两个不同的变量,各自代表着不同的存储空间。所以是不同的变量,只是同名罢了。。。不要再搞混淆了。
顺便和你说一下全局变量这个东东吧。
全局变量就是在函数体之外定义的变量,就是说不属于任意一个函数。它是所有函数都能用的。
是共享数据。不过如果你在某一个函数里面有一个变量和全局变量同名的话,全局变量会被覆盖掉,也就是说如果我有一个全局变量 some ,在我的一个函数int any(void)里面也有一个变量 some ,那么如果我在any 函数里用的some是any函数自己定义的而不是全局变量。
不过,全局变量不要经常用。。。因为共享数据很容易改,重要的是改完还不知道在哪里改的。。。所以容易出错,而且也容易跟同名的局部变量混淆,如上面的some。。。
最后,一时兴起和你说一说所谓的函数调用吧。
当你调用函数的时候,系统会创建一个空间来执行函数操作。也就是说,函数的空间是在你调用的时候才创建的,而当你调用完函数之后,函数空间会被销毁。所以呢,这样会比较消耗时间,每一次都创建、销毁。。。但是用函数的话可以让你的代码看起来美观一点,便于阅读,同时也便于维护。。。所以,其中的利弊要自己权衡了。
另外,因为函数空间用完就销毁了,并且,由于作用域的存在。如果你的函数没有返回值的话,你讲得不到任何数据结果(当然,如果你这个函数仅仅是用来输出的话除外)。并且,如果你用指针的话,也可以。因为指针式通过间接引用来进行操作的,这样你在函数里的操作会直接作用到指针所指向的数据上——指针消除了作用域问题,实现了数据共享,但又不会产生全局变量那样的问题。
不过指针也是很深奥、很危险的。。。它同时也是C语言的精华,也是C语言的缺陷。。。
貌似说太多了,希望能对你有用
危险与美丽共存
凝凝oOo
2011-01-25 · TA获得超过147个赞
知道小有建树答主
回答量:242
采纳率:100%
帮助的人:147万
展开全部
首先要明白什么叫做函数,函数调用时参数是如何传递的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友38c8e98
2011-01-25 · TA获得超过2658个赞
知道小有建树答主
回答量:1131
采纳率:0%
帮助的人:592万
展开全部
看来你是没理解实参、形参的概念。
void swap(int *p1,int *p2)//这里的p1 p2是形参
{
int p;
p=*p1;
*p1=*p2;
*p2=p;
}
swap(p2,p3);//p2 p3为实参
形参p1等于实参p2 形参p2等于实参p3
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zheng_zhiwen12
2011-01-25 · TA获得超过543个赞
知道小有建树答主
回答量:265
采纳率:100%
帮助的人:105万
展开全部
首先你程序的可读性上我就要说一下了,一般在定义、赋值、代码是要分开写的,你看你的程序赋值都写在了输入函数下了,这样不好。应该要养成一个好习惯!
void swap(int *,int *);
int *p1,*p2,*p3;
int a,b,c;

p1=&a;
p2=&b;
p3=&c;

printf("Please input three number:\n");
scanf("%d%d%d",&a,&b,&c);
if(a>b)
swap(p1,p2);
if(a>c)
swap(p1,p3);
if(b>c)
swap(p2,p3);
printf("%d,%d,%d",a,b,c);
getch();
}
void swap(int *p1,int *p2)
{
int p;
p=*p1;
*p1=*p2;
*p2=p;
}
这样别人看你的程序就更清晰了,你要知道你写的程序不只是给你一个人看的!
至于你所说的p3在调换函数并没有出现,那你问下你自己,这个函数是怎样来交换两个数的位置的?你原理没明白,所以才会产生这种认识错误!这个交换函数它所传入的是一个地址,一个数的地址!如果你愿意你也可以把它改成
void swap(int *p1,int *p3)
{
int p;
p=*p1;
*p1=*p3;
*p3=p;
}
这与是p1还是p2这个形参名,是没有关系的!
好好想想,实在不明白就看内存吧。在vs在进行单步调试!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式