前言
本文主要介绍引用与指针的联系和区别。
额外补充了与C++11中的新关键词nullptr
相关的内容。
一、引用和指针的联系
int a = 10; int& ra = a;
语法上面,引用(ra
)是a
的别名是不需要再去开创空间的;
举个例子:
int main() { int a = 10; int& ra = a; cout<<"&a = "<<&a<<endl; cout<<"&ra = "<<&ra<<endl; return 0; }
运行截图:
底层实现,引用是通过指针来实现的,需要开创空间。
例子:
int main() { int a = 10; int& ra = a; ra = 20; int* pa = &a; *pa = 20; return 0; }
这个例子中,引用和指针的汇编代码对比:
二、引用和指针的不同点
1.引用概念上定义一个变量的别名,指针存储一个变量地址。
2. 引用在定义时必须初始化,指针没有要求 。
3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体 。
4. 没有NULL引用,但有NULL指针 。
5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32 位平台下占4个字节) 。
6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小 。
7. 有多级指针,但是没有多级引用 。
8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理 。
9. 引用比指针使用起来相对更安全。
额外补充知识(C++11中的关键词nullptr)
1.NULL
我们在C语言中会使用的指针空值 NULL,在C++中被沿用。我们先来了解一下NULL:
NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:
#ifndef NULL #ifdef __cplusplus #define NULL 0 //NULL被定义为字面常量0 #else #define NULL ((void *)0) //被定义为无类型指针(void*)的常量 #endif #endif
因此,我们在使用空值的指针时,会遇到一些麻烦。比如:
void f(int) { cout<<"f(int)"<<endl; } void f(int*) { cout<<"f(int*)"<<endl; } int main() { f(0); f(NULL);//程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的初衷相悖 f((int*)NULL); return 0; }
运行截图:
在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针
(void*)
常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void*)0
2.nullptr
为了避免例子中的情况出现,C++11引入了一个新的关键词nullptr
表示指针空值。
使用nullptr
要注意:
1.在使用nullptr
表示指针空值时,不需要包含头文件,因为nullptr
是C++11作为新关键字引入的。
2. 在C++11中,sizeof(nullptr)
与 sizeof((void*)0)
所占的字节数相同。
3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr
。
总结
以上就是今天要讲的内容,本文介绍了引用与指针的联系和区别,额外补充了与C++11中的新关键词nullptr
相关的内容。本文作者目前也是正在学习C++相关的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。
最后,如果本篇文章对你有所启发的话,希望可以多多支持作者,谢谢大家!