回 帖 发 新 帖 刷新版面

主题:论"引用"作法强横篇

#include <iostream.h>

void main()
{
    int* a=new int;
    *a=10;
    int *b=a;
    int *c;
    c=a;
    cout<<"执行 int* a=new int; "<<endl;
    cout<<"执行 *a=10; "<<endl;
    cout<<"执行 int *b=a; "<<endl;
    cout<<"执行 int *c; "<<endl;
    cout<<"执行 c=a; "<<endl;
    cout<<endl;

    cout<<"指针a本身的地址(即&a): "<<&a<<endl;
    cout<<"指针b本身的地址(即&b): "<<&b<<endl;
    cout<<"指针c本身的地址(即&c): "<<&c<<endl;

    cout<<"指针a贮存的东西(即a) : "<<a<<endl;
    cout<<"指针b贮存的东西(即b) : "<<b<<endl;
    cout<<"指针c贮存的东西(即c) : "<<c<<endl;        

    cout<<endl;
    int* d=new int;
    *d=10;
    int *&e=d;
    int *&f=d;

    cout<<"执行 int* d=new int; "<<endl;
    cout<<"执行 *d=10; "<<endl;
    cout<<"执行 int *&e=d; "<<endl;
    cout<<"执行 int *&f=d; "<<endl;
    cout<<endl;

    cout<<"指针d本身的地址(即&d): "<<&d<<endl;
    cout<<"指针e本身的地址(即&e): "<<&e<<endl;
    cout<<"指针f本身的地址(即&f): "<<&f<<endl;

    cout<<"指针d贮存的东西(即d) : "<<d<<endl;
    cout<<"指针e贮存的东西(即e) : "<<e<<endl;
    cout<<"指针f贮存的东西(即f) : "<<f<<endl;

    cout<<endl;
    cout<<"==============================个人分析================================"<<endl;
    cout<<"   首先,由上面运行结果可知,引用是一模一样的(除了变量名),而指针只是指向的"<<endl;
    cout<<"东西一样.\n"<<endl;
    cout<<"   网上百度了一下,发现谈指针与引用的异同的人很多,先举一些说法:"<<endl;
    cout<<"1. 引用是一个const指针,一旦被赋值,不允许改变."<<endl;
    cout<<"2. 用引用,编译器会自动为其解引用,而不用像指针那样使用\"*\"."<<endl;
    cout<<"3. 引用是直接数据的内存虚拟空间地址,而指针是变量,占有实际地址."<<endl;
    cout<<"4. 引用无法改变指向对象,而指针可以."<<endl;
    cout<<"5. 引用本身没有标识,没有自已的地址."<<endl;
    cout<<"6. 引用必须在初始化时被指定."<<endl;
    cout<<"8. \"**\"与\"*&\"是一码事,只是语法不同,看到\"*&\"就要想到\"**\"...."<<endl;
    cout<<"9. ......"<<endl;

    cout<<"   还有很多,简洁起见就不一一列举了,但是看了之后,感觉还是有些别扭,总"<<endl;
    cout<<"觉得他们没说到骨子里去,又或是未能给一个便于理解且合乎情理的说法.以"<<endl;
    cout<<"下,我将从人情的角度谈谈个人愚见,也为那些初学者找个简单点的借口,^-^"<<endl;

    cout<<"  不知大家接触了C++的类思想了吗?我们知道有三种访问权限:私有,公开,保护."<<endl;
    cout<<"若是全部私有了,则无法对外交流,若是全部公开了,则缺乏安全感.于是便有"<<endl;
    cout<<"了介于私有和公开之间的保护权限.事物都在发展,同情理,若是只能采用值"<<endl;
    cout<<"传递,未免太劳累了吧?若是全用指针,则又未免不太安全,于是引用这种可"<<endl;
    cout<<"传地址,又安全的机制的产生那是呼之欲出的事."<<endl;
    cout<<"    可是我们来看一看实现语句,不免别扭,以前接触的都是: "<<endl;
    cout<<"X类型= X类型, "<<endl;
    cout<<"   这种顺其自然的事自容易理解,简单类型就传简单类型的值, 指针就传指针的"<<endl;
    cout<<"值(注意指针本身的值是地址哦), 天经地义.可你来这么一个:  "<<endl;
    cout<<"X类型 & = X类型 "<<endl;
    cout<<"   说是在传址吗?可一看,明明就是两个简单类型嘛(简单为例,以便于理解).可虽"<<endl;
    cout<<"看起来是简单类型,它又明明是在传址...是有些不太顺眼...有人说是在起别名,诚"<<endl;
    cout<<"然,它的作用确实和起别名相似,可是起别名都是这方主动对对象起啊,你有听过那"<<endl;
    cout<<"方的对象自已走过来套你起的名字吗?  "<<endl;
    cout<<"没有吧...呵呵... "<<endl;

    cout<<"那么到底怎么解释这个语句\"X类型 & = X类型\"容易理解呢?"<<endl;
    cout<<"抛开那些流行的行话不听,抛开那些麻烦的过程不看,一句话就行了:\"强制地址传递\"!"<<endl;
    cout<<"呵,简而言之,"<<endl;
    cout<<" &: \"强制传址\"! "<<endl;

    cout<<"嘻嘻,一点愚见,为初学者提供便利. 有不妥处,欢迎指教"<<endl;
    cout<<"而你大可在以后学熟了,再回过头来了解其过程"<<endl;
}

回复列表 (共23个回复)

21 楼

有没有汇编的代码,看一下,我不会反编译。

还有,关于引用和指针的内存分配问题,由于引用必须和具体的对象联系起来,离开对象,引用就失去了意义,没有孤立的引用,从设计上它也就不需要分配内存。但到底分不分,还是要事实说话,所以谁有汇编的代码,贴一下。

指针分配内存,这都知道。不过指针的确跟类型关系不大,定义一个float的指针,让它指向一个int的变量,它就按flaot读取16个字节,而如果是引用,就没这么freestyle,就会出项错误

22 楼

哈,有争论是好事.越争则越清晰.
顺路转播一下世界杯情况,哈哈,
德国队四比二胜啦!!!
比赛很精彩啊,德国两次远射直中龙门死角啊!!!而对手也有一次射门好搞笑喽,接到传球转身过去的时侯,那时距球门还有一段距离,居然一个德国后卫也没有,晕死,轻松的射进了!
不过更晕的是, 我在食堂电视机前等了一个小时才等到它出现,看了下开幕式后还等了一个小时,结果没看已干掉一瓶啤酒了。。。呵。。。  

23 楼

德国VS哥斯达黎加的射门比是25比4,德国凸显强者本色,一脚好球玩得像指针一样,极富灵活性,攻击性.既管被哥斯达黎加成功抢断22次,但那只是若干次走过场的引用,足球的地址始终在德国人脚下...嘿嘿!

我来回复

您尚未登录,请登录后再回复。点此登录或注册