引用和指针的区别

article/2025/9/20 20:05:23

引用和指针的区别:

 C++的引用(Reference)

1.定义引用就是给某个变量起别名,对引用的操作和对该变量操作完全相同。
int a = 10;
int& b = a;//b就是a的别名
b++;
cout << a << endl;//11

2 常引用
1)定义引用时加const修饰,即为常引用,不能通过常引用修改引用的目标。
eg:
int a = 100;
const int& b = a;//b是a常引用
a = 200;//ok
b = 200;//error

============  
2)普通的引用只能引用左值,常引用也叫作万能引用,既能够引用左值也能够引用右值。
int& r = 100;//error
const int& rc = 100;//ok 

3)关于左值和右值
左值:可以放在赋值运算符左侧,可以被修改,可以被取地址
int i;
i = 100;
++i;//101
int* pi = &i;
--》普通的变量都是左值
--》前缀表达式值是左值
--》赋值表达式值是左值
(++i) = 200;//ok
cout << i << endl;//200
(i = 300) = 400;//ok
cout << i << endl;//400

右值:只能放在赋值运算符右侧,不可被修改,不可被取地址
常见的右值:
--》字面值常量:10 = i; ++10; int* p = &10;
--》大部分的表达式值都是右值:
    int a = 10;
      int b = 20;
    (a+b) = 30;//error
    int i = 1;
    cout << i++ << endl;//1
    cout << i << endl;//2
--》函数的返回值
  int foo(void){
    int a=100;
    return a;//编译会定义一个临时变量"temp"保存a
  }
  int main(void){
    int res = foo();//函数调用结果就是"temp"
        foo() = 200;//error
    ++foo();//error
    int* p = &foo();//error
  }

3 引用型函数的参数
1)将引用用于函数的参数,可以修改实参变量的值,可以减小函数调用的开销,避免实参到形参值的复制。

2)引用型参数有可能意外修改实参变量的值,如果不希望修改实参本身,可以将形参定义为常引用,提高传参效率的同时可以接受常量型的实参。


4 引用型函数返回值
1)可以将函数的返回类型声明为引用,避免函数返回值所带来的内存开销,如果一个函数返回类型被声明为引用,那么该函数的返回值就是一个左值。
2)为了避免在函数外部修改 引用的目标变量,可以为该引用附加常属性。
3)不要从函数中返回局部变量的引用,因为所引用的内存会在函数返回以后被释放。
4)可以在函数中返回成员变量,静态变量、全局变量的引用

5 引用与指针(笔试题)
1)引用本质就是指针,但是建议使用引用而不是指针。
  double d = 1.234;
  -->double& rd = d;//rd
  -->double* const pd = &d;//*pd

2)指针可以不初始化,其指向目标可以修改(除指针常量),而引用定义时必须初始化,且一旦初始化引用目标不能修改。
int a,b;
int* p;//ok
p = &a;
p = &b;

int& r;//error
int& r = a;//r引用变量a
r = b;//把b的值赋值给a

3)可以定义指针的指针(二级指针),但是不能定义引用的指针
int a = 10;
int* p = &a;
int** pp = &p;//ok

int& r = a;
int& *pr = &r;//error

4)可以定义指针的引用,但是不能定义引用的引用
int a = 10;
int* p = &a;
int*& rp = p;//ok

int& r = a;
int&& rr = r;//error,int&&在C++11叫右值引用

5)可以定义指针数组,但是不能定义引用数组
int a=10,b=20,c=30;
int *arr[3]={&a,&b,&c};//ok
int& rarr[3]={a,b,c};//error

6)可以定义数组引用
int arr[3]={1,2,3};
int (&r)[3] = arr;//r就是数组的别名
arr[0] <==> r[0]

7)和函数指针一样,可以定义函数的引用,其语法基本一致
void func(int a,int b){
   cout << a << b << endl;
}
int main(void){
   void (*pfunc)(int,int) = func;
   pfunc(10,20);//10 20
   
   void (&rfunc)(int,int) = func;
   rfunc(10,20);//10 20
}
 


http://chatgpt.dhexx.cn/article/gDjLhMC7.shtml

相关文章

C++中引用和指针的区别

下面用通俗易懂的话来概述一下&#xff1a; 指针-对于一个类型T&#xff0c;T*就是指向T的指针类型&#xff0c;也即一个T*类型的变量能够保存一个T对象的地址&#xff0c;而类型T是可以加一些限定词的&#xff0c;如const、volatile等等。见下图&#xff0c;所示指针的含义&am…

C/C++引用和指针的区别

为什么C/C语言使用指针&#xff1f; 答案&#xff1a;①一方面&#xff0c;每一种编程语言都使用指针。不止C/C使用指针。 每一种编程语言都使用指针。C将指针暴露给了用户(程序员)&#xff0c;而Java和C#等语言则将指针隐藏起来了。 “Everything uses pointers. C just expo…

C++ 引用详解(引用的特点,引用与指针的区别,引用的其他使用)

目录 引用一.引入</font>二.C中较为麻烦的运算符</font>三.引用的定义</font>四.引用的特点五.对比指针与引用六.引用与指针的区别&#xff08;重点&#xff09;1.语法层面的区别2.汇编层面的区别 七.引用的其他使用 引用 一.引入 在生活中&#xff0c;我们…

Zipkin和Sleuth

“sleuth的作用是在系统中自动埋点并把数据发送给zipkin,zipkin的作用是存储这些数据并展现。” 说白了 sleuth就是为了Zipkin服务的 看了一圈 总结一下 就是微服务的链路追踪 我们看这个延迟的时间可以判断哪个服务出现了问题 进而排查出问题 简单说&#xff1a;假如服务 …

spring-cloud-sleuth分布服务跟踪式

why: 1,微服务架构微服务增多&#xff0c;一个客户端请求形成一个复杂的分布式服务调用链路&#xff0c;如果任何一个服务延迟过高或错误&#xff0c;都会引起请求失败。 how&#xff1a; 先引入了example&#xff1a; https://github.com/spring-cloud/spring-cloud-sleuth 1…

笔记:Sleuth 的底层逻辑

Sleuth 是通过打入到 Log 中的“卧底”来串联前后日志的。你集成了 Sleuth 组件之后&#xff0c; 它会向你的日志中打入三个“特殊标记”&#xff0c;其中一个标记你应该已经清楚了&#xff0c;那便是 Trace ID。剩下的两个标记分别是 Span ID 和 Parent Span ID&#xff0c;…

sleuth介绍

spring Cloud Sleuth为 spring Cloud提供了分布式跟踪的解决方案&#xff0c;它大量借用了Google Dapper、 Twitter Zipkin和 Apache HTrace的设计&#xff0c;先来了解一下 Sleuth的术语&#xff0c; Sleuth借用了 Dapper的术语。 span&#xff08;跨度&#xff09;&#xff…

sleuth 链路追踪

一&#xff1a;什么是链路追踪 对于以前的单服务器项目而言&#xff0c;如果一个地方出了问题&#xff0c;很容易去找到。可是对于微服务架构项目来说&#xff0c;因为微服务太多&#xff0c;而且往往是一个微服务调用了很多其他的微服务&#xff0c;如果一个地方出错&#xff…

java sleuth配置

java sleuth配置 springCloud学习记录SpringCloud Alibaba sleuth&#xff08;分布式请求链路跟踪&#xff09;zipkinsleuthpomyml springCloud学习记录 SpringCloud Alibaba sleuth&#xff08;分布式请求链路跟踪&#xff09; 在微服务框架种&#xff0c;一个由客户端发起的…

Spring Cloud Sleuth+Zipkin 构建微服务链路跟踪系统

什么是链路跟踪系统&#xff1f; 在微服务中&#xff0c;多个服务分布在不同物理机器上&#xff0c;各个服务之间相互调用。如何清晰地记录服务调用过程&#xff0c;并在出现问题的时候能够通过查看日志和服务之间的调用关系来定位问题&#xff0c;这样的系统就叫做链路跟踪系…

SpringCloud Sleuth入门介绍

案例代码:https://github.com/q279583842q/springcloud-e-book 一、Sleuth介绍 为什么要使用微服务跟踪?它解决了什么问题&#xff1f; 1.微服务的现状&#xff1f; 微服务的现状   随着业务的发展&#xff0c;单体架构变为微服务架构&#xff0c;并且系统规模也变得越来…

Spring Cloud Sleuth HTTP详解

目录 1版本关系 2简介 2.1术语 2.2调用链可视化 2.2.1使用Zipkin进行分布式跟踪 2.2.2错误可视化 2.2.3使用Brave进行分布式跟踪 2.2.4将Sleuth添加到项目中 3调用信息生成与上报原理 3.1初始化配置类 3.2过滤器-请求过滤 3.3调用信息拦截 3.4调用信息上报 4日志…

Sleuth链路追踪

文章目录 Spring-Cloud-Alibaba-Sleuth链路追踪一、链路追踪介绍二、Sleuth入门演示&#xff1a; 三、ZipKin介绍ZipKin服务端安装ZipKin数据持久化 Spring-Cloud-Alibaba-Sleuth链路追踪 一、链路追踪介绍 在大型的微服务项目中&#xff0c;一个系统被拆分成许多模块&#xf…

sleuth原理详解

sleuth原理 1、关键术语 Span&#xff1a;Span基本工作单元&#xff0c;发送一个远程调度任务就会产生一个Span, Span 是用 64ID唯一标识的&#xff0c;Trace是用另一个64ID唯一标识的。Span还包含了其他的信息&#xff0c;例如摘要、时间戳事件、Span的ID以及进程 ID。Trace…

07-搭建微服务-链路追踪Sleuth

1、为什么使用链路追踪&#xff1f; 在微服务中&#xff0c;随着服务越来越多&#xff0c;对调用链的分析越来越复杂。 出现问题&#xff1a; 1、微服务之间的调用错综复杂&#xff0c;用户发送的请求经历哪些服务&#xff0c;调用链不清楚&#xff0c;没有一个自动化的工具类来…

sleuth入门

Sleuth介绍 SpringCloud Sleuth主要功能就是在分布式系统中提供追踪解决方案。它大量借用了Google Dapper的设计&#xff0c; 先来了解一下Sleuth中的术语和相关概念。 Trace 由一组Trace Id&#xff08;贯穿整个链路&#xff09;相同的Span串联形成一个树状结构。为了实现请求…

集成sleuth_Spring Cloud Sleuth整合zipkin过程解析

这篇文章主要介绍了Spring Cloud Sleuth整合zipkin过程解析,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 SpringCloud Sleuth 简介 Spring Cloud Sleuth为Spring Cloud实现了分布式跟踪解决方案。 Spring Clo…

集成sleuth_整合Sleuth

Sleuth是 springcloud 分布式跟踪解决方案。 Sleuth 术语&#xff1a; 跨度(span ) &#xff1a;Sleuth 的基本工作单元&#xff0c;他用一个64位的id唯一标识。出ID外&#xff0c;span还包含 其他的数据&#xff0c;如 描述&#xff0c;时间戳事件&#xff0c;键值对注解等&am…

Spring Boot 中的 Sleuth 是什么, 如何使用

Spring Boot 是一个非常流行的 Java Web 开发框架&#xff0c;它提供了许多方便的功能&#xff0c;其中之一就是 Sleuth。Sleuth 是一个分布式跟踪系统&#xff0c;用于跟踪应用程序中的请求和操作。在本文中&#xff0c;我们将探讨 Spring Boot 中的 Sleuth 是什么&#xff0c…

sleuth原理分析

背景 微服务模式下&#xff0c;一次请求可能会经过多个服务。如果没有日志链将单次请求的日志串起来&#xff0c;定位问题时很容易陷入海量的日志中&#xff0c;无法快速定位问题。 sleuth是spring cloud中日志链&#xff08;调用链解决方案&#xff09;&#xff0c;引入该依赖…