前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++之引用(下)

C++之引用(下)

作者头像
摘星
发布2023-04-28 09:10:57
1210
发布2023-04-28 09:10:57
举报
文章被收录于专栏:C/C++学习

前言

本文主要介绍引用与指针的联系和区别。 额外补充了与C++11中的新关键词nullptr相关的内容。


一、引用和指针的联系

代码语言:javascript
复制
int a = 10;
int& ra = a;

语法上面,引用(ra)是a的别名是不需要再去开创空间的; 举个例子:

代码语言:javascript
复制
int main()
{
	int a = 10;
	int& ra = a;
	cout<<"&a = "<<&a<<endl;
	cout<<"&ra = "<<&ra<<endl;
	return 0;
}

运行截图:

在这里插入图片描述
在这里插入图片描述

底层实现,引用是通过指针来实现的,需要开创空间。 例子:

代码语言:javascript
复制
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)中,可以看到如下代码:

代码语言:javascript
复制
#ifndef NULL
#ifdef __cplusplus
#define NULL 0  //NULL被定义为字面常量0
#else
#define NULL ((void *)0)  //被定义为无类型指针(void*)的常量
#endif
#endif

因此,我们在使用空值的指针时,会遇到一些麻烦。比如:

代码语言:javascript
复制
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++相关的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。 最后,如果本篇文章对你有所启发的话,希望可以多多支持作者,谢谢大家!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、引用和指针的联系
  • 二、引用和指针的不同点
  • 额外补充知识(C++11中的关键词nullptr)
    • 1.NULL
      • 2.nullptr
      • 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档