C++之引用(下)

简介: C++之引用(下)

前言

本文主要介绍引用与指针的联系和区别。

额外补充了与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++相关的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。

最后,如果本篇文章对你有所启发的话,希望可以多多支持作者,谢谢大家!

相关文章
|
6月前
|
存储 安全 C++
C++中的引用和指针:区别与应用
引用和指针在C++中都有其独特的优势和应用场景。引用更适合简洁、安全的代码,而指针提供了更大的灵活性和动态内存管理的能力。在实际编程中,根据需求选择适当的类型,能够编写出高效、可维护的代码。理解并正确使用这两种类型,是掌握C++编程的关键一步。
77 1
|
7月前
|
C++
C++中的const指针与const引用
C++中的const指针与const引用
81 2
|
5月前
|
存储 安全 C++
浅析C++的指针与引用
虽然指针和引用在C++中都用于间接数据访问,但它们各自拥有独特的特性和应用场景。选择使用指针还是引用,主要取决于程序的具体需求,如是否需要动态内存管理,是否希望变量可以重新指向其他对象等。理解这二者的区别,将有助于开发高效、安全的C++程序。
32 3
|
5月前
|
存储 自然语言处理 编译器
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
|
6月前
|
存储 安全 编译器
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
66 5
|
6月前
|
C++
C++引用
C++引用
|
6月前
|
存储 安全 编译器
【C++入门】—— C++入门 (中)_引用
【C++入门】—— C++入门 (中)_引用
37 5
|
6月前
|
C语言 C++ 编译器
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
|
6月前
|
安全 测试技术 C++
C++中的引用
C++中的引用
31 1