回 帖 发 新 帖 刷新版面

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

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

沙发

好贴!
顶一下!
引用是为了重载操作符的方便
如果用指针那可读性会大打折扣的
它们本质是一样的
有3点不同
1初始化
2内存分配
3寻址方式
引用是直接引用,指针是间接引用
再顶一下!

板凳

受益呀!

3 楼

了解

4 楼

它们本质是一样的
有3点不同


2内存分配


我有相反的意见!

望liujiwei把指针和引用的内存分配方式说得详细一些!--就本人意见,我认为两者一样...

5 楼

[quote]好贴!
顶一下!
引用是为了重载操作符的方便
如果用指针那可读性会大打折扣的
它们本质是一样的
有3点不同
1初始化
2内存分配
3寻址方式
引用是直接引用,指针是间接引用
再顶一下![/quote]
可是如果是要用到默认参数的话,引用就不如指针方便了。

6 楼

To 4楼:

望liujiwei把指针和引用的内存分配方式说得详细一些!--就本人意见,我认为两者一样...
引用不分配内存,指针分配内存

7 楼

#include <stdlib.h>
#include <stdio.h>
void fun1(int &a) {
    printf("%d\n", a);
}

void fun2(int *a) {
    printf("%d\n", *a);
}

int main() {
    int a = 1;
    fun1(a);
    fun2(&a);
}

上面两个函数fun1、fun2的汇编代码是一样的...

我看不出引用节省了空间...

8 楼

   ;    
   ;    void fun1(int &a) {
   ;    
    push      ebp
    mov       ebp,esp
   ;    
   ;        printf("%d\n", a);
   ;    
@1:
    mov       eax,dword ptr [ebp+8]
    push      dword ptr [eax]
    push      offset s@
    call      @_printf
    add       esp,8
   ;    
   ;    }
   ;    
@2:
    pop       ebp
    ret 

   ;    
   ;    void fun2(int *a) {
   ;    
    push      ebp
    mov       ebp,esp
   ;    
   ;        printf("%d\n", *a);
   ;    
@3:
    mov       eax,dword ptr [ebp+8]
    push      dword ptr [eax]
    push      offset s@+4
    call      @_printf
    add       esp,8
   ;    
   ;    }
   ;    
@4:
    pop       ebp
    ret 

9 楼

2内存分配
3寻址方式

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

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



10 楼

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

我来回复

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