C++ 引用、指针、const

本文详细介绍了C++中的引用和指针概念,包括它们的定义、使用方法及与const关键字结合时的区别。通过实例解释了引用作为别名的工作原理,以及如何正确使用指针避免常见错误。

C++ 引用、指针、const


引用

  • 引用就是对象的一个别名,常用作函数的形式参数。通过在变量名前加“&”来定义。不能定义引用类型的引用,什么是引用类型的引用?
int a = 10;
int& b = a;
int& c = b;
//上面代码可以编译通过,且可运行,c的值也为10
int&& d = c;   //编译不通过,这是引用类型的引用,就如int** p是指针的指针同理


  1. 引用是别名

因为引用只是所绑定对象的一个别名,所以对引用所作的操作都会作用到它所绑定的对象上。
  • 引用必须用于该引用同类型的对象初始化
int i = 1024;
int& ref1;   //error:未初始化
int& ref2 = 100; //error:初始化必须为一个同类型的对象
int& ref3 = i;      //ok

引用与指针区别


  1. 相同点

指针和引用都是地址的概念,指针指向一块内存,它的值是这块内存的地址;引用是某块内存的别名。

  • 区别
    • 引用是个别名,指针是个实体
      • 指针可以为空,引用不能为空
      • 引用使用时不需要解引号(*),而指针需要
      • 引用只能在定义时初始化一次,之后不能改变,指针可以改变指向的对象
      • “sizeof引用”得到的是所绑定对象的大小,而“sizeof指针”得到的是指针本身的大小
      • 引用和指针的自增运算符(++)意义不一样
        引用与指针不难区别,当引用和指针加上const就懵了,看看它们之间的用法吧。

const与引用,指针

const用法

  • const用法主要是防止定义的对象再次被修改,把修饰的对象转变为了一个常量,定义const类型的变量时要初始化。
const int size = 1024; //定义size为常量并初始化为1024,变量size仍然是一个左值,但是是一个不可修改的左值
size = 10;      //error:不可修改const修饰的对象


  • const对象默认为文件的局部变量

在全局作用域声明的const变量是定义在该对象的文件的局部变量,此变量只存在于那个文件中,不能被其它文件访问。通过制定const变量为extern,就可在整个程序中访问const对象。
//file1.cpp
extern const int buf = 512;
//file2.cpp
extern const int buf;       //file1.cpp中buf必须显式地加上extern才能编译通过并使用

const与引用


  • const引用

const引用是指向const对象的引用
const int val = 1024;
int& ref1 = val;    //error:非const引用绑定一个const对象是非法的
const int& ref2 = val;  //ok

//上面代码中ref2不能修改了,任何对ref2的赋值操作都是非法的

const引用可以初始化为不同类型的对象或者初始化为右值

int i = 10;
const int& ref = 20;
const int& ref2 = ref+i;
//编译通过

const与指针


  • 指向const对象的指针

我们可以使用指针来修改所指对象的值,但是如果指针指向的是const对象,我们就不能让指针来修改所指对象的值,c++强制要求指向const对象的指针必须具有const特性。
const int* cptr;
//cptr是一个指向int类型const对象的指针,const限定了cptr指针所指向的对象的类型,而非cptr指针本身。即cptr并不是const。在定义时也就不需要对cptr进行初始化,如果需要,cptr可以改变指向其它 const int型的变量。但不能通过cptr改变所指对象的值
*cptr = 20;     //error:不能修改cptr所指对象的值

允许把非const对象的地址赋给指向const对象的指针

int val = 2;
const int* ref = &val;  //ok,尽管val不是const对象,但是任何想通过ref修改其值的香味都会编译错误
//但是val不是const对象,所有有可能被其它方式修改值,只是ref不能修改val的值


  • const指针

指针本身的值不能修改,即不能改变指针指向其它对象,任何给指针赋值的行为都会编译错误,const指针也必须在定义时初始化。
  • 指向const对象的const指针
const int* const ptr = &a;  //既不能修改所指对象的值,也不允许修改指针指向
基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
### C++ 中 `const` 修饰指针的用法 #### 1. 基本概念 在 C++ 中,`const` 是一个非常重要的关键字,主要用于定义不可修改的数据对象。当它与指针结合时,可以用来控制指针本身或者指针所指向的内容是否可变。 #### 2. 不同形式的 `const` 指针 以下是几种常见的 `const` 指针的形式及其含义: - **指向常量数据的指针** 如果声明为 `const int* ptr`,表示 `ptr` 是一个指向常量整数的指针。这意味着通过该指针无法修改其所指向的对象值,但指针本身的值(即地址)是可以改变的[^2]。 ```cpp const int value = 10; const int* ptr = &value; // *ptr = 20; // 错误:不能修改指向的值 ``` - **常量指针** 如果声明为 `int* const ptr`,则表明这是一个常量指针,意味着一旦初始化后,指针变量不能再指向其他内存位置,但它所指向的内容是可以修改的[^5]。 ```cpp int a = 10, b = 20; int* const ptr = &a; *ptr = 20; // 正确:可以通过指针修改内容 // ptr = &b; // 错误:指针本身不能重新赋值 ``` - **既指向常量又自身是常量的指针** 当声明为 `const int* const ptr` 时,则此指针不仅指向了一个常量数据,而且其自身的值也不能再被修改。这种情况下,无论是指针还是它指向的内容都不能发生变化。 ```cpp const int cValue = 30; const int* const ptr = &cValue; // *ptr = 40; // 错误:不能修改指向的值 // ptr = nullptr; // 错误:指针本身也不允许更改 ``` #### 3. 注意事项 - 需要注意的是,在实际编程过程中应合理运用这些特性来保护数据不被意外改动以及提高程序的安全性和稳定性。 - 对于复杂的表达式可能涉及多重间接操作符(`&`, `*`)的应用场景下务必清晰区分各个部分的作用范围以免引起混淆或错误行为发生[^1]。 ```cpp #include <iostream> using namespace std; void exampleConstPointer() { int x = 5, y = 7; // 创建一个指向常量的指针 const int* px = &x; cout << "*px: " << *px << endl; // 尝试修改指向的值会失败 //*px = 8; // 编译器报错 // 可以让指针指向另一个常量 const int z = 9; px = &z; cout << "*px after reassignment: " << *px << endl; } void exampleConstantPointer() { int m = 10, n = 20; // 定义一个常量指针 int* const pm = &m; cout << "*pm initially points to: " << *pm << endl; // 修改指针指向的内容是可以接受的 *pm = 15; cout << "*pm after modifying content: " << *pm << endl; // 下面这行将会导致编译期错误 // pm = &n; // Cannot assign to a constant pointer } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值