C++-引用和指针区别

文章目录

  • 1.变量的组成
  • 2.指针
    • 2.1 定义
    • 2.2 使用指针操作变量
    • 2.3 为什么使用指针
  • 3.引用
    • 3.1 定义
    • 3.2 引用注意事项
  • 4.引用和指针的区别

1.变量的组成

变量的组成:变量地址,变量名,变量值

例:

int i = 12;

在这里插入图片描述

2.指针

2.1 定义

指针用于存放一个变量在内存中的地址,通过指针间接操作这个变量。指针变量本身也是一个变量,也有变量地址,变量名,变量值。

例:

int i = 12;
int *p; //声明一个整型指针变量p
p = &i; //将i的地址赋给指针变量p

&为取地址符。

int *p = &i;
等价于
int *p; //声明一个整型指针变量p
p = &i; //将i的地址赋给指针变量p

在这里插入图片描述
指针变量p的变量值存放变量i的地址。
*p指向变量i的值

2.2 使用指针操作变量

通过 *p改变变量i的变量值

int i= 12;
int *p = &i; //声明一个整型指针变量p
*p=13;
cout << i << endl;//输出i=13

2.3 为什么使用指针

可以通过变量名i直接改变变量值,为什么通过指针呢?
其实通过变量名改变变量值,中间也是通过地址去访问的。
从运行栈的角度考虑

int    *ip;    /* 一个整型的指针 */
double *dp;    /* 一个 double 型的指针 */
float  *fp;    /* 一个浮点型的指针 */
char   *ch;    /* 一个字符型的指针 */

指针变量ip,dp,fp,ch的内存空间一般都是四字节,所有指针的值的实际数据类型,都是一个代表内存地址的长的十六进制数。

在栈上运行指针,比运行实际的变量所占的内存小, 把指针放到栈中能有效节省空间还能节省传递大参数时所耗费的时间 ,所以能更快, 而且栈空间很小很宝贵 , 不可能把大数据压进去的。

3.引用

3.1 定义

  • 引用是某个变量的别名,相当于某个变量的第二个名字。对引用的操作,就相当于对变量的操作
    引用形式
  • 引用是用&引导定义:类型 &引用名=变量名;
int i = 12;
int &j = i;
cout<<"i="<<i<<"  "<<"j="<<j<<endl;
//输出i=12  j=12j = 13;
cout<<"i="<<i<<"  "<<"j="<<j<<endl;
//输出i=13  j=13cout<<"i的地址是:"<<&i<<endl;
//i的地址是:0x0001cout<<"j的地址是:"<<&j<<endl;
//j的地址是:0x0001

在这里插入图片描述

3.2 引用注意事项

  1. 不能建立引用的引用
  2. 不能建立引用数组,不能建立数组引用
  3. 可以建立指针的引用,不能建立指向引用的指针
int i=0,a[10];
int &&ii=i;  //错误,ii是引用的引用
int &&aa=a;  //错误,aa是数组的引用
int &*ip=i;  //错误,ip是指向引用的指针int *pi=&i;
int *&pr=pi; //正确,pr是指针的引用

4.引用和指针的区别

相同点:

  • 都是地址的概念;
  • 指针指向一块内存,它的内容是所指内存的地址;
  • 引用是某块内存的别名。

区别:

  • 指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元,即指针是一个实体;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。
  • 指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;
  • 指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了,从一而终。
  • ”sizeof引用”得到的是所指向的变量(对象)的大小,而”sizeof指针”得到的是指针本身的大小;
  • 指针和引用的自增(++)运算意义不一样;
  • 引用没有 const,指针有 const,const 的指针不可变;
  • 引用使用时无需解引用(*),指针需要解引用;

参考:
[1]http://t.csdnimg.cn/S3Fu1
[2]https://blog.csdn.net/shang_0122/article/details/104755481
[3]https://blog.csdn.net/tonglin12138/article/details/94555024

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

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

相关文章

java--Calendar

1.Calendar ①代表的是系统此刻时间对应的日历 ②通过它可以单独获取、修改时间中的年、月、日、时、分、秒等(月份是从0开始的)。 2.Calender日历类的常见方法 注意&#xff1a;calender是可变对象&#xff0c;一旦修改后其对象本身表示的时间将产生变化。

Vue3-02-ref() 响应式详解

ref() 是什么 ref() 是一个函数&#xff1b; ref() 函数用来声明响应式的状态&#xff08;就是来声明变量的&#xff09; ref() 函数声明的变量&#xff0c;是响应式的&#xff0c;变量的值改变之后&#xff0c;页面中会自动重新渲染。ref() 有什么特点 1.ref() 可以声明基础…

Idea 插件开发: Swing Designer设计器创建的组件全部为空问题记录

问题现象 通过Swing 设计器创建的对象, Swing组件全部是空的, 导致ToolWindowFactory工厂的实现类调用时候出现了空指针异常 如下方式创建的 问题分析 问题出现时候, 同时给我生成了一个createUIComponents的私有方法, 由于个人当时理解有误, 把他当成了初始化方法, 在里面…

程序员的养生之道

程序员的养生之道 1 对程序员的初次印象2 我的养生之道2.1 规律作息&#xff1a;2.2 合理饮食&#xff1a;2.3 健康饮食&#xff1a;2. 4 增强锻炼&#xff1a;2. 5 心态平和&#xff1a;2. 6 生活习惯&#xff1a;2.7 定期体检&#xff1a;2.8 特殊注意&#xff1a;2.9 补充能…

2-3、运算符

语雀原文链接 文章目录 1、算术运算符2、关系运算符3、逻辑运算符4、赋值运算符5、移位运算符6、位运算符(二进制位进行运算)7、条件运算符:三目运算符8、运算符的优先级 1、算术运算符 &#xff1a;加法-&#xff1a;减法*&#xff1a;乘法/&#xff1a;除法取商%&#xff1…

“创未来,享非凡“ 昇腾AI开发者创享日广州站圆满成功

在羊城广州的科技新风潮中&#xff0c;一个以创新为核心、以智能为驱动的盛会在这座南国明珠城市如火如荼地展开。这不仅是一场技术的盛宴&#xff0c;更是人工智能产业发展动力的一次集结。 12月9日&#xff0c;在广州市工业和信息化局的倡导下&#xff0c;一场主题为“创未来…

【C++数据结构 | 字符串速通】10分钟秒杀字符串相关操作 | 字符串的增删改查 | 字符串与数组相互转换

字符串 by.Qin3Yu 文中所有代码默认已使用std命名空间且已导入部分头文件&#xff1a; #include <iostream> #include <string> using namespace std;概念速览 字符串是一种非常好理解的数据类型&#xff0c;它用于存储和操作文本数据。字符串可以包含任意字符…

data_loader返回的每个batch的数据大小是怎么计算得到的?

data_loader是一个通用的术语&#xff0c;用于表示数据加载器或数据批次生成器。它是在机器学习和深度学习中常用的一个概念。 一、data loader 数据加载器&#xff08;data loader&#xff09;是一个用于加载和处理数据集的工具&#xff0c;它可以将数据集划分为小批次&#…

六:Day03_Mybatis-Plus

一、介绍 MyBatis-Plus&#xff08;简称 MP&#xff0c;是由baomidou(苞米豆)组织开源的&#xff09;是一个基于 MyBatis 的增强工具&#xff0c;它对 Mybatis 的基础功能进行了增强&#xff0c;但未做任何改变&#xff0c;Mybatis-Plus 其实可以看作是对 Mybatis 的再一次封装…

Java 匿名内部类使用的外部变量,为什么一定要加 final?

问题描述 Effectively final Java 1.8 新特性&#xff0c;对于一个局部变量或方法参数&#xff0c;如果他的值在初始化后就从未更改&#xff0c;那么该变量就是 effectively final&#xff08;事实 final&#xff09;。 这种情况下&#xff0c;可以不用加 final 关键字修饰。 …

求导公式,求导的四则运算,复合函数求导

求导公式 求导的四则运算 复合函数求导

【Docker】Docker Compose,yml 配置指令参考的详细讲解

作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…