`
blogfeifei
  • 浏览: 1198241 次
文章分类
社区版块
存档分类
最新评论

c++中引用和指针的内部实现

 
阅读更多

c++中,引用和指针时比较让人混淆的。它们的外在区别想必很多人都知道。在这我再重复一下。

引用在定义时必须初始化,即该引用所引用的必须时确实存在的变量,不能为NULL。而指针就没有这个限制。有人说,引用就相当于一个变量的别名,对该引用所做的操作就相当于对原变量一样。我不太认同这个看法。在内部实现上,其实引用也是通过地址实现的。因此我更想称引用为一种特殊的指针。让我们看看下面这个简单的例子。

#include<iostream.h>

int main()
{
int a=1;
int b=2;
int &c=a;
int *d=&b;
c=*d;
cout<<a<<endl;
cout<<c<<endl;
return 0;

}

反汇编代码如下:

1: #include<iostream.h>
2:
3: int main()
4: {
00401040 push ebp
00401041 mov ebp,esp
00401043 sub esp,50h
00401046 push ebx
00401047 push esi
00401048 push edi
00401049 lea edi,[ebp-50h]
0040104C mov ecx,14h
00401051 mov eax,0CCCCCCCCh
00401056 rep stos dword ptr [edi]
5: int a=1;
00401058 mov dword ptr [ebp-4],1
6: int b=2;
0040105F mov dword ptr [ebp-8],2
7: int &c=a;
00401066 lea eax,[ebp-4] !注意这里,把ebp-4赋给eax,ebp-4即为变量a的地址
00401069 mov dword ptr [ebp-0Ch],eax !把eax 存储在ebp-0Ch这个位置,ebp-0Ch为引用c的位置
8: int *d=&b;
0040106C lea ecx,[ebp-8]
0040106F mov dword ptr [ebp-10h],ecx !这两行和上面的两行是一模一样的
9: c=*d; !把b 的值赋给c
00401072 mov edx,dword ptr [ebp-0Ch] !把a的地址给edx
00401075 mov eax,dword ptr [ebp-10h] !把b的地址给eax
00401078 mov ecx,dword ptr [eax] !把b的值给ecx
0040107A mov dword ptr [edx],ecx !把ecx 即b的值给a,c引用的还是a
10: cout<<a<<endl;
0040107C push offset @ILT+10(endl) (0040100f)
00401081 mov edx,dword ptr [ebp-4]
00401084 push edx
00401085 mov ecx,offset cout (004299c0)
0040108A call ostream::operator<< (00401230)
0040108F mov ecx,eax
00401091 call @ILT+0(ostream::operator<<) (00401005)
11: cout<<c<<endl;
00401096 push offset @ILT+10(endl) (0040100f)
0040109B mov eax,dword ptr [ebp-0Ch]
0040109E mov ecx,dword ptr [eax]
004010A0 push ecx
004010A1 mov ecx,offset cout (004299c0)
004010A6 call ostream::operator<< (00401230)
004010AB mov ecx,eax
004010AD call @ILT+0(ostream::operator<<) (00401005)
12: return 0;
004010B2 xor eax,eax
13:
14: }
004010B4 pop edi
004010B5 pop esi
004010B6 pop ebx
004010B7 add esp,50h
004010BA cmp ebp,esp
004010BC call __chkesp (00403650)
004010C1 mov esp,ebp
004010C3 pop ebp
004010C4 ret

可见,在内部实现上,引用和指针是一模一样的,对引用的更改,就是把引用所指的变量重新赋指,引用本身并没有更改。

分享到:
评论

相关推荐

    深入理解c++指针的指针和指针的引用

    展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它。(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了...

    smartptr——基于自动引用计数的智能指针

    智能指针相信大家听说过吧,我理解的智能指针,既是一个C++模板类,重载了指针操作符(-&gt;)和(*)操作符,而使它的实例可以"用指针的形式去调用"。 它可以接管任意类型的指针,所以你只需要放心大胆的new出任意对象...

    C编程之字符串与指针教程

    ● 数组及其使用方法 ● 如何声明和初始化不同类型的数组 ● 如何声明和使用多维数组 ● 指针及其使用方法 ● 如何声明和初始化不同类型的指针 ... ● 内部指针的概念,创建和使用内部指针的方法

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    1.4 C++程序的编写和实现 1.5 关于C++上机实践 习题 第2章 数据类型与表达式 2.1 C++的数据类型 2.2 常量 2.2.1 什么是常量 2.2.2 数值常量 2.2.3 字符常量 2.2.4 符号常量 2.3 变量 2.3.1 什么是变量 2.3.2 ...

    指针数组和数组指针的区别.doc

    答案是这样的,在c++中,输出字符指针就是输出字符串,程序会自动在遇到\0后停止.  我们最后分析一下段2中的代码,段2中我们调用了print_array()这个函数,这个函数中形式参数是char *array[]和代码中的char *test[]...

    C++编程思想 例子和叙述讲解C++编程

    10.1 C++中的指针 176 10.2 C++中的引用 176 10.2.1 函数中的引用 177 10.2.2 参数传递准则 178 10.3 拷贝构造函数 179 10.3.1 传值方式传递和返回 179 10.3.2 拷贝构造函数 182 10.3.3 缺省拷贝构造函数 187 10.3.4...

    Effective C++

    Effective C++(编程的50个细节)着重讲解了编写C++程序应该注意的50个细节问题,书中的每一条准则描述了一个编写出更好的C++的方式,每一个条款的背后都有具体范例支持,书中讲的都是C++的编程技巧和注意事项,很多都...

    C++编程思想 编程

    10.2 C++中的引用 176 10.2.1 函数中的引用 177 10.2.2 参数传递准则 178 10.3 拷贝构造函数 179 10.3.1 传值方式传递和返回 179 10.3.2 拷贝构造函数 182 10.3.3 缺省拷贝构造函数 187 10.3.4 拷贝构造函数方法的...

    C++编程思想.pdf

     全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚...

    C++ Primer第四版【中文高清扫描版】.pdf

    对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。本书的前言阐述了 第4版和前一版的不同之处。 【目录信息】 第1...

    新手学习C++入门资料

    在C语言中,输入输出是使用语句scanf()和printf()来实现的,而C++中是使用类来实现的。 #include iostream.h main() //C++中main()函数默认为int型,而C语言中默认为void型。 { int a; cout; cin&gt;&gt;a; /*输入...

    免费下载:c++编程思想(中文)

    10.1 C++中的指针 176 10.2 C++中的引用 176 10.2.1 函数中的引用 177 10.2.2 参数传递准则 178 10.3 拷贝构造函数 179 10.3.1 传值方式传递和返回 179 10.3.2 拷贝构造函数 182 10.3.3 缺省拷贝构造函数 187 10.3.4...

    C++编程思想(用简单的例子和简练的叙述讲解C++编程)

    10.1 C++中的指针 176 10.2 C++中的引用 176 10.2.1 函数中的引用 177 10.2.2 参数传递准则 178 10.3 拷贝构造函数 179 10.3.1 传值方式传递和返回 179 10.3.2 拷贝构造函数 182 10.3.3 缺省拷贝构造函数 187 10.3.4...

    C/C++中关于局部函数中更新实参指针的方法

    在C语言中因为参数的传递方式属于值传递,局部参数在函数内部的改变并不会影响实参的值,有时候为了保存对在函数中的修改,往往采用返回值或者指向指针的指针的形式来实现,我就采用简单的内存分配来说明。...

    C++ 语言 详细教程电子版

    全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚...

    C++编程思想习题

    13.9.3指针和引用的向上映射 13.9.4危机 13.10小结 13.11练习 第14章 多态和虚函数 14.1向上映射 14.2问题 14.3虚函数 14.4C++如何实现晚捆绑 14.4.1存放类型信息 14.4.2对虚函数作图 14.4.3撩开面纱 14.4.4安装...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    1.4 C++程序的编写和实现 1.5 关于C++上机实践 习题 第2章 数据类型与表达式 2.1 C++的数据类型 2.2 常量 2.2.1 什么是常量 2.2.2 数值常量 2.2.3 字符常量 2.2.4 符号常量 2.3 变量 2.3.1 什么是变量 2.3.2 ...

Global site tag (gtag.js) - Google Analytics