回 帖 发 新 帖 刷新版面

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

#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个回复)

11 楼

[quote]2内存分配
3寻址方式

不对了,内存和寻址都是一样的,在汇编意义上引用就是指针.见sarrow&nbsp;的反汇编.

引用和指针的重大区别在于:
1.引用是不能计算的,指针是可以+,&nbsp;-的.
2.引用是强类型(所以可以用到运算符等地方),而指针基本上不考虑类型.



[/quote]
它们再实现上是一样的
但是内存分配是不一样的
引用在有的编译器是不能相加的
指针怎么就不考虑类型啊

12 楼

指针和引用的主要区别:
     引用是对象的别名,它总是有效,而指针可能无效。
     指针需占用空间,引用不占。

13 楼

[quote]
不对了,内存和寻址都是一样的,在汇编意义上引用就是指针.见sarrow 的反汇编
[/quote]

我只知道反编译,不是知道反汇编是什么东西?

[quote]
To7楼:
引用的形参与实参是同一地址,而指针则需要分配内存
那这样是不是能够节省空间嘛
[/quote]

请给出实际的证据,来证明引用没有分配像指针一样了内存!

14 楼

int _tmain(int argc, _TCHAR* argv[])
{
    int a = 10 ;
    int &b =a ;
    int *i =&a;
         cout<<&a<<endl;
         cout<<&b<<endl;
    cout<<&i<<endl;
       return 0;
}
a和b共用一个存储空间,而i却是不同的
变量名只是地址的代表
再编译之后a和b同一个地址
因此没有分配
而指针却分配了

15 楼

把汇编代码出来先!

16 楼

我不太会汇编
你可以自己编译一下了

17 楼

liujiwei

我不想和你再在这个问题上纠缠了!

我只能告诉你,“引用和指针在汇编级别上是没有区别的!”

你若继续坚持引用没有另行分配空间,那我也无话可说了!

就我而言,引用不过是被“阉割”了的指针,被去了“势”!但其本质不会改变,仍然是指针!

18 楼

在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。 
不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。 
指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变 

这个是转的

19 楼

[quote]
 
 liujiwei

我不想和你再在这个问题上纠缠了!
[/quote]

这样对新人不好吧...!!!嘿嘿...

切入正题吧.
从11楼后liujiwei的说法具体上是对的,而看到sarrow的回复大吃一惊,你今天没吃酒吧.

本来准备随便草草回复一下.
"引用不分配空间,内存分配4byte空间"

但看到了15楼你说的话,但由于本人才疏学浅,不懂你说的反编译代码.所以请到了朋友kai帮解释一下.
原话"他的汇编反编译是看不出指针和引用区别的."

20 楼

"引用不分配空间,内存分配4byte空间"

--->
"引用不分配空间,指针分配4byte空间"


修改以上...笔误了....

我来回复

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