| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1230 人关注过本帖
标题:关于指针的一个小问题
只看楼主 加入收藏
YUILILI
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2016-4-25
结帖率:50%
收藏
已结贴  问题点数:15 回复次数:2 
关于指针的一个小问题
指针的那个互换2个数字,就是有个算法的设计错误看的不是很懂,想不明白。
程序代码:
void swap(int *p,int *q)
{
    int *temp;
    *temp = *p;
    *p = *q;
    *q = *temp;
}


不明白的是:
1.如果定义int *temp,为什么个*p.*q互换数值语法错误。
2.然后就是*temp不是也是指向数值那一类的吗,和*p.*q互换不也可以吗?
3.我知道int *p是int型的,可是*temp不也是int型吗?为啥要定义成int temp才给对??
4.还有一个,为啥没有return,是因为可以省略掉吗?然后不用return,形参怎么返回数值给实参输出。。

问题虽小,疑问颇多,不好意思各位大神了。
2016-05-03 22:33
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:8 
个人理解:应该是这个样子,如有不对请多指教;
void swap(int *p,int *q)
{
    int temp;
    temp = *p;
    *p = *q;
    *q = temp;
}
*p及*q是指针,本质是一个内存的物理地址,而这个地址一般是用16进制表示的,但不管用什么进制表示都是一个数值,所以通过一个同样类型的temp中间变量来过渡,交换两个地址的值,从而实现两个指针指向的交换,达到要交换数值的目的。
从你的理解,我感觉你是把指针当一个箭头,是一个方向,当然某种理解上也对,但你想一下:比如*p指向1,*q指向2,直接交换指向就可以交换数值了,其实内存中1和2的真实的物理地址没有变,也就是保存1和2两个数值的地点没有改变。只是你改变了变量的指向,所以外面输出的时候,变量的两个值交换了;
下面举两个例子你看下,希望能帮到你:
1、通过一个中间变量来直接交换两个数值。
int a=1,b=2,t;
t=a;
a=b;
b=t;
这种交换是变量a和b的物理地址(即数字1,2的存储的位置)不变,把变量a中存储的1取出放到中间变量t(暂存在另一个存储位置)中,这样a变量内存空出,把b中的2取出存储a内存中,这样b变量分配到的内存空出,把t暂存的1取出存到b中,这样实现a和b数值的交换;这个过程中可以看出,变量a和变量b的所分配的内存的物理地址没变,交换的是两个内存中存储的数字。
形象举例:本来小明(变量a)住在1号屋子,小红(变量b)住在2号屋子,先在两座屋子边上另外临时找第三个屋子3号屋子(变量t),然后小明换到3号屋子,把1号屋子空出来(变量a的地址不变,分配的内存空出),接着把小红换到1号屋子;接着把小明从3号屋子(变量t)中取出换到2号房子,从而实现两个屋子换人住的目的(也就是交换a,b变量的值);

2、而通过指针实现数值交换呢,本质上来说变量a和变量b所分配内存中保存的数值在交换前和交换后没有变换,交换的是变量a与b的物理地址;
形象举例:本来小明(变量a)住在1号屋子(a分配内存的地址、指针p),小红(变量b)住在2号屋子(b分配内存的地址),通过交换两家房子的门牌号(交换变量a和b所分配内存的地址)来实现小明换到2号屋子,小红换到1号屋子的目的;其实上两人并没有换屋子住,换的是屋子的门牌号;
ps:你定义一个*temp(其实这个指针你定义出来没有赋初值,也就是个空指针,没有分配内存的),

[此贴子已经被作者于2016-5-4 08:28编辑过]

2016-05-03 23:10
未来大仙
Rank: 6Rank: 6
来 自:黑窟窿
等 级:侠之大者
威 望:4
帖 子:263
专家分:491
注 册:2015-6-20
收藏
得分:8 
1,每个指针在存值之前都需要有一块空间,你的temp指针没有申请空间,所以不能存放p或者q的值,所以错误
2,同1,如果直接 int temp; 就不需要申请,可以直接交换,如果非要用指针,也可而已 int *temp,a; temp=&a;   这样就多此一举了。
3,同 1,2.
4,之所以用指针,是因为指针的速度更快,更灵活。 假设 int *p=&a,*q=&b;  用指针做参数,就不会在函数内部申请一块临时空间,即,如果函数的参数是 int p,int q,那么系统会在内存池中 另外申请2块临时空间,直到这个函数调用完毕了才会销毁,如果这样做,那么传进来的值就是在这2块临时空间调换的值,而不是a和b调换的。

好好学习,天天向上!
2016-05-04 08:25
快速回复:关于指针的一个小问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036194 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved