C++ Primer笔记002:引用/指针/const

文章目录

  • 1. 引用
    • 1.1 引用不是对象或变量
    • 1.2 引用必须初始化
    • 1.3 不能定义引用的引用
    • 1.4 引用类型要适配
    • 1.5 非const引用不能绑定字面值
  • 2. 指针
    • 2.1 指针和引用的区别
    • 2.2 指针的指针
    • 2.3 类型一致
    • 2.4 指针的引用
    • 2.5 void 型指针
  • 3. const
    • 3.1 const的基本作用
    • 3.2 对const变量的引用
    • 3.3 不能把一般引用与const变量进行绑定
    • 3.4 const变量的引用可以绑定字面值
    • 3.5 不存在const引用
  • 4. const与指针
    • 4.1 const变量的值不能改变
    • 4.2 const变量的指针可以存储非常量的地址
    • 4.3 const常量的存储地址
    • 4.4 const指针

1. 引用

1.1 引用不是对象或变量

引用就是对象或变量的别名,但引用不是对象或变量

int a=10;
int &b=a;

这里面,b就是变量a的另一个名字,对b操作就是对a操作,对a操作,b也会变化

void testreference()
{int a=10;int &b=a;b=5;cout<<a<<b<<endl;a=4;cout<<a<<b<<endl;
}

在这里插入图片描述

1.2 引用必须初始化

因为引用一定是某个变量的别名,引用一定是和变量绑定在一起的,所以引用必须初始化

int a=10;
int &b; <---错误

在这里插入图片描述

1.3 不能定义引用的引用

因为引用不是对象,但是引用又要绑定一个对象,所以不能定义引用的引用

int a=10;
int &b=a;
int &(&c)=a; <---错误

在这里插入图片描述

1.4 引用类型要适配

因为操作引用就是操作变量或者对象本身,所以对于内置类型,变量和其引用之间的类型要适配。

int a=10;
float &b=a; <---错误

在这里插入图片描述

1.5 非const引用不能绑定字面值

因为引用必须和变量进行绑定,所以非const引用不能绑定字面值

int a=10;
int &b=20; <---错误

在这里插入图片描述

所以,引用的基本特性就五个:

1.不是对象;
2.必须初始化;
3.不能定义引用的引用;
4.类型适配;
5.不能绑定字面值.

2. 指针

2.1 指针和引用的区别

指针就是变量的地址,可以通过引用访问变量,也可以通过指针访问变量,但是指针是对象,而引用不是,这是二者的根本区别

void testpointer()
{int a=10;int *p=&a;int *q;cout<<p<<endl<<q<<endl;
}

在这里插入图片描述

通过上述代码,可以知道,指针可以不初始化(只是为了演示,不要这样做),但是引用必须初始化

另外,&符号既能表示引用,也是取地址符号,当&出现在=左侧时,是引用,在=右边就是取地址

2.2 指针的指针

因为指针是一个对象,所以可以定义指针的指针,但是不能定义引用的引用

void testpointer()
{int a=10;;int *p=&a;int *q;int **pp = &p;cout<<p<<endl<<q<<endl;cout<<pp<<endl;
}

在这里插入图片描述

所以,指针的引用的不同点就是:

1.引用必须初始化,指针不用,
2.可以定义指针的指针,但是不能定义引用的引用,这两点的原因就是指针是变量,而引用不是(只是个别名)

2.3 类型一致

指针所指向的数据的类型要和指针的类型一致

float a=10;
int *p=&a;

在这里插入图片描述

2.4 指针的引用

因为指针是对象,引用不是,所以可以定义指针的引用,但是不能定义引用的指针

void testpr()
{int i=0;int *pi=&i;int *&pr=pi;cout<<pr<<endl<<pi<<endl;*pr=4;cout<<i<<endl;
}

在这里插入图片描述

int *&pr=pi;说明了如何定义一个指针的引用,可以从右向左读。
先看pr部分,我们知道有个对象叫pr;接着看到&pr,我们知道pr是一个引用
最后看到int *,就知道这个引用和一个int类型的指针绑定,这个指针就是pi
因为pr是pi的别名,所以对可以通过pr改变i。

2.5 void 型指针

void型指针可以存放任意类型的指针(包括二级指针),但是不能对void型指针解引用,所以void*指针可以保护数据所在的内存不被修改

void testvoidp()
{double d=1.2;double *pd=&d;int i=11;int *pi=&i;void *vp=pi;vp=pd;cout<<__func__<<endl;cout<<*vp;
}

在这里插入图片描述

3. const

3.1 const的基本作用

之前所讲的C++中的变量值,都是可以赋值的,如果我们不允许对变量赋值,那么就要将变量设置为const。

void testconst()
{const int c=10;c=20;
}

在这里插入图片描述

可见,只能对const变量进行初始化,不能对其赋值,因为const变量的值不能被改变

3.2 对const变量的引用

可以用const来修饰一个引用,称为对const变量的引用,对const变量的引用不能直接修改所绑定的对象(这个性质通常用于函数传参,使传的参数在函数中不能被改变)

void testconst()
{int i=2;const int &ri=i;ri=3;
}

在这里插入图片描述也就是说,无法通过ri来修改i的值

3.3 不能把一般引用与const变量进行绑定

因为const的变量无法修改,所以不能把一般引用const变量进行绑定

void testconst()
{const int c=10;int &ri=c;
}

如果可以通过一般引用来绑定const的变量,那么就可以通过该引用修改const变量,与const的属性相冲突,所以,不能用一般引用与const变量进行绑定。
在这里插入图片描述

3.4 const变量的引用可以绑定字面值

一般的引用不能与字面值进行绑定,但是const变量的引用可以绑定字面值(因为有const修饰)。而且,const变量的引用不仅可以绑定字面值,还可以绑定一般的对象(允许类型不匹配)

   void testconst(){double d=1.2;const int &rc=10;const int &rc1=d;cout<<rc<<endl<<rc1<<endl;}

在这里插入图片描述

正是因为const变量的引用几乎可以绑定任何对象,所以函数的参数一般都设定为const变量的引用,扩大了函数可传参数的范围

此外,由于是按引用传参,所以避免了拷贝,加快了代码的执行速度。

当执行const int &rc1=d;时,rc1并不是真正的和d绑定,而是绑定了一个临时变量,编译器会把这句代码转化成下面这样

const int tmp=d; //类型转换 double to int
const int &rc1=tmp;

在这种情况下,引用绑定的是一个临时量对象不是d本身,而是临时变量tmp

c++认为,常量引用可以绑定这个临时量,而普通引用就不能绑定这个临时量。因为c++认为,使用普通引用绑定一个对象,就是为了能通过引用对这个对象做改变。如果普通引用绑定的是一个临时量而不是对象本身,那么改变的是临时量而不是希望改变的那个对象,这种改变是无意义的。所以规定普通引用不能绑定到临时量上。

那么为什么常量引用就可以呢,因为常量是不能改变的。也就是说,不能通过常量引用去改变对象,那么绑定的是临时量还是对象都无所谓了,反正都不能做改变,也就不存在改变无意义的情况。

所以,常量引用可以绑定临时量,也就可以绑定非常量的对象、字面值,甚至是一般表达式,并且不用必须类型一致。

3.5 不存在const引用

4.因为引用并不是对象,所以不存在const引用(注意理解const变量的引用和const引用的区别)

void testconstreference()
{double d=1.2;int  &const rc=10; //const的引用const int &rc1=d;cout<<rc<<endl<<rc1<<endl;
}

在这里插入图片描述

const变量的引用与一般引用(见C++知识点——指针、引用基础)的区别

1.一般引用不能绑定字面值。但是const变量的引用就可以	
2.一般引用要与绑定的数据的类型一致,但是const变量的引用是个例外

4. const与指针

4.1 const变量的值不能改变

const变量的值不能改变,所以想要存放const变量的地址,就需要使用指向const变量的指针。

void testconstpointer()
{const int i=0;const int *pi=&i;cout<<pi<<endl;
}

在这里插入图片描述

4.2 const变量的指针可以存储非常量的地址

所以指向const变量的指针的基本作用就是存储const变量的地址,而且const变量的指针也可以存储非常量的地址(类型要匹配),因为pi本身是变量pi本身并不是const

void testconstpointer()
{int i=0;const int *pi=&i;cout<<pi<<endl;
}

在这里插入图片描述

4.3 const常量的存储地址

const变量i的地址不能使用指向非常量的指针来存储,而且非常量的指针也不能指向常量的指针,否则可以通过指针修改const变量。

void testconstpointer()
{const int i=0; const int *pi=&i; //对int *p=&i; //错,p不是常量指针cout<<pi<<endl;
}

在这里插入图片描述

=======================================

void testconstpointer()
{const int i=0;const int *pi=&i;int *p=&pi;cout<<pi<<endl;
}

在这里插入图片描述

4.4 const指针

因为引用不是对象,但是指针是对象,所以存在const指针

void testconstpointer()
{int i=0;const int *const pi=&i;cout<<pi<<endl;
}

在这里插入图片描述

const int *const pi;的读法依然采用从右向左的读法

先看到pi,我们知道这是一个变量,接着看到const,我们知道他是一个const变量,然后看到*,我们知道这个是const的指针变量,看到const int我们知道这个const指针指向一个const int

因为pi用const修饰,所以pi中存储的地址值不能改变,也就是说,pi本身不能改变

void testconstpointer()
{int i=0;int j=0;const int *const pi=&i;pi=&j;cout<<pi<<endl;
}

在这里插入图片描述

因为pi指向const int,所以不能通过pi来改变指向的对象的值。

void testconstpointer()
{int i=0;int j=0;const int *pi=&i;*pi=10;cout<<pi<<endl;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/166524.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jprofiler V14中文使用文档

JProfiler介绍 什么是JProfiler? JProfiler是一个用于分析运行JVM内部情况的专业工具。 在开发中你可以使用它,用于质量保证,也可以解决你的生产系统遇到的问题。 JProfiler处理四个主要问题: 方法调用 这通常被称为"CPU分析"。方法调用可以通过不同的方式进行测…

抖音热搜榜:探索热门话题的奥秘

抖音热搜榜是抖音平台根据用户观看、点赞、评论、分享等行为数据&#xff0c;综合计算得出的热门话题排行榜。它反映了当前平台上最热门、最受欢迎的话题和内容。抖音热搜榜有以下几个作用和意义&#xff1a; 1. 满足用户需求&#xff1a;抖音热搜榜为用户提供了丰富的热门话题…

微信小程序完整项目实战(前端+后端)

基于微信小程序的在线商城点单系统 前言&#xff1a;闲来无事&#xff0c;想以后自己开一个小超市或者小吃店&#xff0c;能够支持线上下单&#xff0c;既方便客户也方便自己。系统采用Java语言作为后端实现与小程序的交互&#xff0c;给用来学习或者想自己开个小店的朋友当个参…

Reparameterization trick(重参数化技巧)

“Reparameterization trick”&#xff08;重参数化技巧&#xff09;是一种在训练生成模型中处理随机性潜在变量的方法&#xff0c;特别常见于变分自动编码器&#xff08;VAE&#xff09;等模型中。这个技巧的目的是使模型可微分&#xff08;differentiable&#xff09;&#x…

新年学新语言Go之五

一、前言 Go虽然不算是面向对象语言&#xff0c;但它支持面向对象一些特性&#xff0c;面向接口编程是Go一个很重要的特性&#xff0c;而Go的接口与Java的接口区别很大&#xff0c;Go的接口比较复杂&#xff0c;这里仅用一个最简单例子做介绍&#xff0c;复杂的我也还没学。 …

PostgreSQL与MySQL数据库对比:适用场景和选择指南

数据库是现代应用程序的基石之一&#xff0c;而在选择合适的数据库管理系统&#xff08;DBMS&#xff09;时&#xff0c;开发者常常会面临着许多选择。在这方面&#xff0c;PostgreSQL和MySQL是两个备受瞩目的选项。本文将深入研究这两者之间的异同&#xff0c;并为您提供适用场…

鸿蒙HarmonyOS应用开发:扫描仪文件扫描

华为鸿蒙HarmonyOS已经发展到4.0&#xff0c;使用ArkTS作为开发语言。这篇文章结合Dynamsoft Service开发一个简单的鸿蒙应用&#xff0c;用来获取办公室里连接PC的扫描仪(惠普&#xff0c;富士通&#xff0c;爱普生&#xff0c;等)&#xff0c;把文档扫描到手机里。 准备工作…

JUC高并发容器-CopyOnWriteArrayList

CopyOnWriteArrayList JUC高并发容器线程安全的同步容器类什么是高并发容器&#xff1f;CopyOnWriteArrayList JUC高并发容器 线程安全的同步容器类 Java同步容器类通过Synchronized(内置锁)来实现同步的容器&#xff0c;比如Vector、HashTable以及SynchronizedList等容器。线…

数据可视化与GraphQL:利用Apollo创建仪表盘

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

Defender Antivirus占用资源怎么禁止

前言 有时Defender Antivirus 突然磁盘IO很高。导致机器卡得很&#xff0c;开发代码很不方便&#xff0c;本文就介绍如何禁用这个服务。2f089809-2c6f-4fb7-86f5-8b5cbca8bd0d 操作 下载Defender Control https://www.sordum.org/9480/defender-control-v2-1/ 这是当前的最…

EtherCAT主站SDO写报文抓包分析

0 工具准备 1.EtherCAT主站 2.EtherCAT从站&#xff08;本文使用步进电机驱动器&#xff09; 3.Wireshark1 抓包分析 1.1 报文总览 本文设置从站1的对象字典&#xff0c;设置对象字典主索引为0x2000&#xff0c;子索引为0x00&#xff0c;设置值为1500。主站通过发送SDO写报文…

openGauss学习笔记-104 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书替换

文章目录 openGauss学习笔记-104 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书替换104.1 操作场景104.2 前提条件104.3 注意事项104.4 操作步骤 openGauss学习笔记-104 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书替换 openGaus…

【RNA structures】RNA转录的重构和前沿测序技术

文章目录 RNA转录重建1 先简单介绍一下测序相关技术2 Map to Genome Methods2.1 Step1 Mapping reads to the genome2.2 Step2 Deal with spliced reads2.3 Step 3 Resolve individual transcripts and their expression levels 3 Align-de-novo approaches3.1 Step 1: Generat…

二维码智慧门牌管理系统升级解决方案:高效、便捷、安全的外业数据管理方法

文章目录 前言一、背景与需求二、升级解决方案三、方案优势 前言 在当今的信息化社会&#xff0c;数据管理的重要性日益凸显。尤其对于像二维码智慧门牌管理系统这样的复杂系统&#xff0c;如何实现高效、便捷、安全的数据管理&#xff0c;成为了系统升级的重要议题。本文将详…

大模型相关基础(基于李沐)

InstructGPT 介绍 ChatGPT用到的技术和InstructGPT一样的技术&#xff0c;区别是InstructGPT是在GPT3上微调&#xff0c;ChatGPT是在GPT3.5上微调。 InstructGPT论文发表在2022年3月4号&#xff0c;标题是《训练语言模型使得它们能够服从人类的一些指示》。 标题解释&#…

[深入浅出AutoSAR] SWC 设计与应用

依AutoSAR及经验辛苦整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入浅出AutoSAR》 全文 3100 字&#xff0c; 包含 1. SWC 概念 2. 数据类型&#xff08;Datatype&#xff09; 3. 端口&#xff08;Port&#xff09; 4. 端口接口&#xff08;Portinterface&…

性能压测工具 —— wrk

一般我们压测的时候&#xff0c;需要了解衡量系统性能的一些参数指标&#xff0c;比如。 1、性能指标简介 1.1 延迟 简单易懂。green:一般指响应时间 95线&#xff1a;P95。平均100%的请求中95%已经响应的时间 99线&#xff1a;P99。平均100%的请求中99%已经响应的时间 平…

51单片机的时钟系统

1.简介 51内置的时钟系统可以用来计时&#xff0c;与主程序分割开来&#xff0c;在计时过程中不会终端主程序&#xff0c;还可以通过开启时钟中断来执行相应的操作。 2.单片机工作方式 单片机内部有两个十六位的定时器T0和T1。每个定时器有两种工作方式选择&#xff0c;分别…

Python 机器学习入门之K-Means聚类算法

系列文章目录 第一章 Python 机器学习入门之线性回归 K-Means聚类算法 系列文章目录前言一、K-Means简介1、定义2、例子3、K-Means与KNN 二、 K-Means实现1、步骤2、优化2.1 初始化优化之K-Means2.2 距离优化之elkan K-Means 三、优缺点1、优点2、缺点 前言 学完K近邻算法&a…

【深度学习】数据集最常见的问题及其解决方案

简介 如果您还没有听过&#xff0c;请告诉您一个事实&#xff0c;作为一名数据科学家&#xff0c;您应该始终站在一个角落跟你说&#xff1a;“你的结果与你的数据一样好。” 尝试通过提高模型能力来弥补糟糕的数据是许多人会犯的错误。这相当于你因为原来的汽车使用了劣质汽…