首页 > 编程语言 >C++中指针、引用与const的深入解析

C++中指针、引用与const的深入解析

时间:2024-10-23 23:17:06浏览次数:3  
标签:const 指向 int 常性 C++ 引用 指针

一、对数组的引用

const int n = 10;
int ar[n] = {12,23,34,45,56,67,78,89,100};
描述数组:类型加上原始空间大小。
​
int &ra = ar[1];
​
int &br = ar;//error
int (&br)[n] = ar;//ok
int *pa[10];
int &pr[10];//error;为什么不能编译成功
  1. 引用数组的概念:在 C++ 中,引用是一个别名,它必须被初始化以指向一个已经存在的对象。引用本身不是一个对象,它不能“存储”值,而是直接引用另一个对象的值。因此,引用类型不能用作数组的元素类型,因为数组的元素需要在数组创建时被默认初始化(如果它们没有显式初始化),而引用类型不能被默认初始化。

  2. 初始化问题:当声明一个数组时,数组的每个元素都需要被初始化(除非它们被显式地标记为未初始化,例如在某些类型的动态分配中)。然而,对于引用类型的数组,每个元素都需要一个已存在的对象来引用,这在数组声明时通常是不可能的,因为编译器不知道要引用哪些具体的对象。

  3. 编译器的限制:由于上述原因,C++ 标准不允许创建引用类型的数组。编译器在遇到这样的声明时会报错,因为它违反了引用的基本规则和数组的内存管理需求。

二、对指针的引用

int a = 10, b = 20;
int *p = &a;  //p是a指针,保存a的地址
int *s = p; //s是p的指针,保存p的地址
int *&rp = p;//rp是指针的引用,即是p的别名
​
*rp = 100;//通过解引用修改的是a的值
rp = &b;将p保存的地址修改为b的地址

三、例题,将指针,引用,const融合起来,分析

int main()
{
    int a = 10, b = 20;
    int* const p = &a;
    int* s1 = p;
    const int *s2 = p;
    int* const s3 = p;
    const int* const s4= p;
}

这是之前做过的一个例题,但是分析结果是所有都能编译通过,因为所有表达式都没有去试图修改p自身的值

如果改型为下述,分析结果

int main()
{
    int a = 10, b = 20;
    int* const p = &a;
    
    int* &s1 = p;
    const int *&s2 = p;
    int* const &s3 = p;
    const int* const &s4= p;
}

我们定义了一个常性指针,即p自身的值不能修改,所有试图能够修改p自身值的定义都不能被编译通过,接下来逐个分析:

①定义s1是p指针的引用,即s1是p的别名,如果修改s1自身,就会试图修改p的值,所以不能编译通过;

②定义s2是一个指向常量的指针的引用,仍然是p的别名,但是这个别名指向的位置是常性的,这意味着通过 s2,不能修改 p 指向的值,但可以让 s2指向另一个地址,即可以通过s2修改p的值,所以不能编译;

③定义s3作为一个常性指针的引用,即不可以通过s3改变p的值,但可以改变p指向的值,合法;

④s4是一个常性的指向常量的指针的引用,既不能修改 s4 指向的地址,也不能修改 s4指向的值。

四、总结

  1. 指针与引用的区别
    • 指针是一个变量,存储了另一个变量的内存地址。指针可以被重新赋值以指向其他对象,也可以进行算术运算。
    • 引用是一个别名,它必须被初始化以指向一个已经存在的对象,并且在初始化后不能改变其指向。引用更直观,更安全。
  2. 引用数组的概念与限制
    • 在C++中,不允许创建引用类型的数组,因为数组的每个元素需要在创建时被初始化,而引用类型不能被默认初始化。
    • 每个引用元素都需要引用一个已经存在的对象,这在数组声明时通常是不可能的。
  3. 指针的引用
    • 引用指针(即指针的引用)是合法的,并且可以用于改变指针所指向的地址。
    • 例如,int *&rp = p; 使得 rp 成为 p 的别名,通过 rp 可以修改 p 所指向的地址。
  4. const与指针、引用的结合
    • const int* p;p 是一个指向常量的指针,可以通过 p 读取所指向的值,但不能通过 p 修改所指向的值。
    • int* const p = &a;p 是一个常性指针,指向 int 类型变量 ap 本身的值(即它所存储的地址)不能被修改,但可以通过 p 修改所指向的 int 值。
    • 当 const 与指针的引用结合时,需要特别注意指针本身的常性(即指针的值是否能被修改)以及指针所指向对象的常性(即所指向的值是否能被修改)。
  5. 常见误区分析
    • 试图让非常性指针的引用指向常性指针是错误的,因为这会允许通过引用(一个非常性指针的引用)来“修改”(即重新赋值)常性指针所指向的地址。
    • 指向常量的指针的引用(即使该引用本身不是常性的)也不能用于改变常性指针所指向的地址,因为常性指针的值本身是不能被修改的。这里的错误在于混淆了指针的常性和所指向对象的常性。
    • 常性指针的引用是合法的,它允许通过引用(实际上是常性指针的别名)来访问或修改常性指针所指向的值,但不能改变常性指针所指向的地址。
    • 指向常量的常性指针的引用是最严格的,既不能改变所指向的地址,也不能修改所指向的值。

标签:const,指向,int,常性,C++,引用,指针
From: https://blog.csdn.net/w20010915/article/details/143196383

相关文章

  • C++ set和map的模拟实现
    我们之前在红黑树里讲过,STL容器中的set与map底层就是一棵红黑树,要模拟实现set与map底层需要实现红黑树,并将其做一些改造1.set类与map类的框架1.1setnamespacepc{ template<classK> classset { public://成员函数 private: RBTree<K,K,SetC......
  • C++运算符优先级
    在C++中,二进制运算符的优先级如下(从高到低):逻辑非(!)按位取反(~)乘法(*),除法(/),取余(%)加法(+),减法(-)左移(<<),右移(>>)关系运算符(<,<=,>,>=)等于(==),不等于(!=)按位与(&)按位异或(^)按位或(|)逻辑与(&&)逻辑或(||)条件运算符(?:)......
  • 实验2 C++
    任务1:t.h1#pragmaonce23#include<string>45//类T:声明6classT{7//对象属性、方法8public:9T(intx=0,inty=0);//普通构造函数10T(constT&t);//复制构造函数11T(T&&t);//移动构造函数12~T();......
  • C++基础——敲桌子游戏
    C++基础——敲桌子游戏一、敲桌子1.游戏内容:2.编译思路二、头文件三、主文件四、整体代码五、运行结果一、敲桌子1.游戏内容:从1开始数到100,如果数字的个位或者十位为7,或者数字是7的倍数,则显示"敲桌子",否则显示数字本身。2.编译思路系统通过for循环语句打印从1到......
  • C++调试经验(4):Linux下调试CAN通信的方法
    1.CAN通信介绍         CAN(ControllerAreaNetwork,控制器局域网)是一种现代的通信协议,用于在各种应用中的不同设备之间进行高速通信。它最初由德国的Bosch公司于20世纪80年代开发,用于汽车中的电子系统之间的通信,目前已广泛应用于汽车行业以及其他工业领域。CAN通信......
  • C++学习路线(二十一)
    俄罗斯方块 初始化页面#include<iostream>#include<graphics.h>#include<Windows.h>usingnamespacestd;voidwelcome(){ initgraph(550,660); HWNDwindow=GetHWnd(); SetWindowText(window,_T("俄罗斯方块")); setfont(40,0,_T("A......
  • C++ deque容器
    dequedeque是C++STL库中的一个容器,常用来当stack、queue的适配器。在算法领域中,适用于解决单调队列单调栈等问题。下面我们就来认识一下deque容器。文章目录deque1.vector与list区别2.deque的介绍和使用2.1deque的介绍2.2deque的使用2.2.1数据访问(**Elementacce......
  • C++ STL基本用法概述(简洁版)
    vector变长数组,倍增思想基本函数 size()   //返回元素个数,时间复杂度为o(1)empty()   //返回a是否为空,时间复杂度为o(1)clear()   //清空front()/back()   //返回第一个数/最后一个数push_back()   //最后插入一个数pop_back()   //删掉最后一个数......
  • (分享源码)计算机毕业设计必看必学 上万套实战教程手把手教学JAVA、PHP,node.js,C++、pyth
    摘 要大数据时代下,数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已经是成为一种势不可挡的趋势。在网络小说的要求下,开发一款整体式结构的小说网站,将复杂的系统进行拆分,能够实现对需求的变化快速响应、系统稳定性的保......
  • 计算机毕业设计项目推荐,基于协同过滤算法的短视频推荐系统设计与实现30213(开题答辩+程
    摘 要现阶段,社会的发展和科技的进步,以及大数据时代下纷繁数据信息的融合,使得人们在生产及生活过程中,都将会接收到各种类型的数据信息,而通过计算机技术与网络技术,则能够将众多人们所不了解或不常用的信息,以简单的模式转化并传递给人们,使得人们的生产及生活质量得以显著提升......