首先,我在网上搜索了下C++指针和引用的区别,得到的结果大致如下:
1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如: int a=1;int *p=&a; int a=1;int &b=a; 上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。 而下面2句定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个存储单元。 (2)可以有const指针,但是没有const引用; (3)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的) (4)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化; (5)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。 (6)"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小; (7)指针和引用的自增(++)运算意义不一样;
首先我测试了第一条,但是发现并不是这样子,求高手指教。代码如下:
class A{ char name[]; int age; }; void init() { A a; A &aref1 = a; A *aPointer = &a; }
对应的汇编代码如下:
_Z4initv: .LFB0: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 subl $16, %esp leal -12(%ebp), %eax movl %eax, -8(%ebp) leal -12(%ebp), %eax movl %eax, -4(%ebp) leave .cfi_restore 5 .cfi_def_cfa 4, 4 ret
看上面的汇编代码我们会发现指针和引用的操作都是一样的,且引用也占据着栈上的内存[-8(%ebp)]。
下面来看看引用和指针作为函数参数的表现是怎样的?
先来看看引用的情况,代码如下:
class A{ public: char name[32]; int age; }; void init(int off, A& a) { a.age = 25 + off; }
对应的汇编代码如下:
_Z4initiR1A: .LFB0: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 movl 8(%ebp), %eax leal 25(%eax), %edx movl 12(%ebp), %eax movl %edx, 32(%eax) popl %ebp .cfi_def_cfa 4, 4 .cfi_restore 5 ret .cfi_endproc
从语句
movl 12(%ebp), %eax
movl %edx, 32(%eax)
我们看出【12(%ebp)】这里存放着传入A的实例的地址。
再来看看指针的情况,代码如下:
class A{ public: char name[32]; int age; }; void init(int off, A* a) { a->age = 25 + off; }
对应的汇编如下:
_Z4initiP1A: .LFB0: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 movl 8(%ebp), %eax leal 25(%eax), %edx movl 12(%ebp), %eax movl %edx, 32(%eax) popl %ebp .cfi_def_cfa 4, 4 .cfi_restore 5 ret .cfi_endproc
我们可以看出和上面引用的情况是一样的。
3. 对引用取地址
代码如下:
class A{ char name[]; int age; }; void init() { A a; A &aref1 = a; A *aPointer = &a; int ptr = (int)&aref1; }
汇编如下:
_Z4initv: .LFB0: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 subl $16, %esp leal -16(%ebp), %eax movl %eax, -12(%ebp) leal -16(%ebp), %eax movl %eax, -8(%ebp) movl -12(%ebp), ea%x movl %eax, -4(%ebp) leave .cfi_restore 5 .cfi_def_cfa 4, 4 ret .cfi_endproc
我们可以看到只有在对引用类型取地址之后才将a的地址赋值给它。说明c++对引用类型的取地址操作进行了封装。
相关推荐
C++指针与引用的区别 指针和引用是C++语言中两种不同的概念,初学者容易把它们混淆一起。这两种概念都是地址的概念,但它们有很多不同的特点和应用场景。 相同点 1. 都是地址的概念;指针指向一块内存,它的内容...
在C++编程语言中,指针和引用是两种非常重要的概念,它们允许程序员对内存进行直接操作,提高代码的灵活性和效率。对于初学者来说,理解并熟练掌握这两个概念至关重要。 首先,我们来探讨指针。指针在C++中扮演着...
C++指针和引用 本资源主要介绍了C++语言中的指针和引用概念,包括指针的概念、指针变量、指针与数组、指针与函数、指针数组与二级指针、动态分配/释放内存、引用等知识点。 1. 指针的概念 指针是内存单元的地址,...
在C++编程语言中,指针和引用是两种非常重要的概念,它们都允许我们间接访问内存中的对象。本文将深入探讨这两个主题,并通过实例来对比它们的使用方法和特性。 首先,指针是C++中的一种特殊类型,它存储的是一个...
### C++指针与引用详解 #### 指针与引用的基本概念 在C++中,指针和引用是两种非常重要的数据类型,它们都用于间接访问其他变量或对象。然而,它们之间存在显著的区别,了解这些差异对于有效、安全地使用C++语言至...
在 C++ 编程语言中,指针和引用是两个常用的概念,但是初学者容易混淆它们二者之间的区别。在本文中,我们将从概念、函数参数传递和编译角度来阐述指针和引用的区别。 概念上,指针是一个变量,它存放的是变量的...
在C++编程语言中,指针和引用是两种非常关键的概念,它们都允许我们间接访问内存中的对象。然而,它们之间存在着本质的区别,理解和掌握这些差异对于编写高效、安全的代码至关重要。 首先,指针是一个变量,它存储...
在C++编程语言中,高阶指针和引用是两种重要的高级特性,它们极大地扩展了对内存和对象的操纵能力。本实验通过两个实例详细介绍了这两种概念及其在实际编程中的应用。 首先,我们来看第一个实例,它涉及到了二级...
实验8 指针与引用实验报告 .doc
访问指针引用的内存区域 可以使用*pNumberOne访问some_number的值。这是因为星号表示解除指针的参照,应该读作“什么什么指向的内存区域”。 指针的陷阱 当函数退出时,局部变量将被删除,这意味着指针将指向原先的...
C++指针练习题详解 本文将详细解释 C++ 指针练习题,包括选择题和填空题,涵盖了指针的基本概念、指针运算符、指针数组、字符串处理等多方面的知识点。 一、选择题 1. 选择题 1:对数组 a 的引用不正确的是() ...
在C++中,引用(reference)和指针都是用来间接访问其他对象的工具,但它们在使用和行为上有显著的差异。引用的概念是C++特有的,而指针在C和C++中都存在。理解这两种机制的区别对于编写高质量的C++代码至关重要。 ...
本笔记将深入探讨C++指针的精髓,包括其基本概念、使用方法以及高级应用。 首先,我们要理解指针的基本原理。在C++中,指针是一个变量,它存储的是另一个变量的内存地址。当我们声明一个指针变量时,例如`int *p;`...
这份"**C++指针资料集合**"显然是一个宝贵的资源,包含了关于C++指针的多种学习材料,旨在帮助程序员深入理解和熟练运用指针。 C++中的指针本质上是一个变量,它存储的是另一个变量的内存地址。理解指针的三大关键...
在C++编程语言中,指针和引用是两种非常重要的概念,它们允许我们间接地访问和操作内存中的数据。以下是一些关于指针和引用的知识点: 1. 指针定义与初始化: - 指针可以用来存储变量的地址。例如,`int x, *p1, *...
"C++指针面试题经典"这个资源,很可能是针对C++开发者,特别是初级到中级水平的程序员设计的面试题集合,旨在测试和提升他们在指针方面的理解与应用能力。金山公司的面试题历来以深度和实用性著称,这些题目和解答...
在这个名为"C/C++指针的用法总结实例工程"的项目中,我们将深入探讨五种关键的指针相关概念,包括双重指针、引用、指针函数、指针数组以及数组指针,并通过实际的例子来帮助理解这些概念。 首先,让我们看看双重...