| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3206 人关注过本帖
标题:指针是伟大的!
只看楼主 加入收藏
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
别学楼主的样,函数要像下面这样。

void xchange(int * a, int * b)
{

    *a = *a + *b;
    *b = *a - *b;
    *a = *a - *a;
}

—>〉Sun〈<—
2007-12-06 23:31
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:0 
原帖由 [bold][underline]cosdos[/underline][/bold] 于 2007-12-6 23:10 发表 [url=http://bbs.][/url]
void xchange(int a,int b)
{
*(int *)a=*(int *)a +*(int *)b;
*(int *)b=*(int *)a-*(int *)b;
*(int *)a=*(int *)a-*(int *)b;
}

把a 强制转换为 (int *) 然后再取值。

完全不正确!

//- ...


结果倒是正确
因为他是这样调用的xchange(&a,&b);


- -!
指针是很伟大
但也不是这么用的
真理和谬误只有一步之遥
其实楼主要是加上一句typedef int INT_HANDLE;
声明改成这样void xchange(INT_HANDLE a,INT_HANDLE b);就比较好了
当然要是这么用的话最好别用int,使用unsigned long会更好一些

[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2007-12-06 23:33
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:0 
原帖由 [bold][underline]cosdos[/underline][/bold] 于 2007-12-6 23:31 发表 [url=http://bbs.][/url]
别学楼主的样,函数要像下面这样。

void xchange(int * a, int * b)
{
    *a = *a + *b;
    *b = *a - *b;
    *a = *a - *a;
}


这种用法其实没问题
不过在这里就没有必要这样使用了
另外的问题就是我上一贴说的了
像楼主这样容易使人迷惑

这样使用的目的就是为了想他人隐藏你某个具体数据结构的实现
比如有某个结构struct  name
这个结构的具体细节只需要你自己的模块知道就成了
而其他模块不关心这个结构的具体实现的情况下就可以这样用
能更好的做到数据封装和隐藏

不过相当不建议c的初学者就这样滥用指针
还是老老实实使用指针打牢基础再说

[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2007-12-06 23:42
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
隐藏数据使用的是自定义的类型。

    这个函数形参是 int 类型的,我看到函数就觉得有问题,但 居然楼主把地址作为参数。

无语!


[[italic] 本帖最后由 cosdos 于 2007-12-7 01:10 编辑 [/italic]]

—>〉Sun〈<—
2007-12-07 01:09
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 
看看热闹
2007-12-07 02:17
redice
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:902
专家分:0
注 册:2006-12-11
收藏
得分:0 
在32位机中,内存地址是用四个字节表示的,这正好和int类型的大小一致,因此我们可以采用int来存放其它变量的地址。(int *)将a和b转换成整型指针,这样在使用*(int *)a时,编译器就知道应该在内存首地址为a和b的区域里取多少个字节进行计算了。(int *,就取四个字节,也就是一个整型)


[color=blue]这样做固然麻烦,但是可以让你从更本质上理解指针。[/color]

肤浅的人是不会理解的!

鲲鹏数据 - 专业Web数据采集服务提供者
http://www.
2007-12-07 09:05
redice
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:902
专家分:0
注 册:2006-12-11
收藏
得分:0 
回复 12# 的帖子
谢谢

鲲鹏数据 - 专业Web数据采集服务提供者
http://www.
2007-12-07 09:12
jxj777
Rank: 1
等 级:新手上路
帖 子:91
专家分:0
注 册:2007-10-27
收藏
得分:0 
引用传递,指针传递,数值传递,
指向地址寄存器,变换寄存器的值

一个人的力量是缈小的....... 互帮互助才是出路
2007-12-07 09:24
vlinux
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2006-8-29
收藏
得分:0 
原帖由 redice 于 2007-12-7 09:05 发表
在32位机中,内存地址是用四个字节表示的,这正好和int类型的大小一致


这是由具体的C编译器决定的而不是多少位的CPU,在TC中int就没四个字节那么大方了。当然,在TC中一个内存地址也是用2个字节来存储,所以你的代码仍然能在TC下运行。

一般而言,优秀点的编译器都会提示这样的强制转换存在危险性。与楼主观点相反的是,我倒没从中看到多少C语言指针的强大,我看到的是脆弱...
2007-12-07 09:32
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 
#define xchange(a,b) a^=b^=a^=b
quite simple
2007-12-07 09:58
快速回复:指针是伟大的!
数据加载中...
 
   



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

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