当前位置: 首页 > news >正文

【和春笋一起学C++】(十四)指针与const

将const用于指针,有两种情况:

const int *pt;
int * const pt;

目录

1. const int *pt

2. int * const pt

3. 扩展


1. const int *pt

首先看第一种情况,const在int的前面,有如下语句: 

int peoples=12;
const int *pt = &peoples;

上面代码表示pt指向的是一个整型常量,*pt是const,不能通过使用pt来修改整型常量的值,以下语句都是非法的。

*pt += 1;///非法,*pt是常量
cin >> *pt;//非法,*pt是常量

const int *pt指针的一个实例:

#include <iostream>
using namespace std;
int sum_arr(const int *begin, const int *end)
{const int *pt;int total = 0;for (pt = begin; pt != end; pt++){total = total + *pt;}return total;
}int main()
{int cookies[6] = { 1,2,4,6,8,10 };int sum = sum_arr(cookies+1, cookies+4);cout << sum << endl;sum = sum_arr(cookies, cookies + 6);cout << sum << endl;return 0;
}

输出结果:

程序说明:

 程序的功能是通过一个函数求一个数组中部分元素或所有元素之和,函数通过两个参数设定数组的区间,并求该区间的所有元素之和。

在C++中,处理数组的函数必须要有数组元素的数据类型,数组的起始位置以及数组中元素数量。传统做法是将数组的起始位置和数组的长度传递给函数,还有另一种给函数提供信息的方法,即指定数组元素的区间,可以通过传递两个指针来完成,一个指针标识数组的开头,另一个指针标识数组的结尾。对于数组来说,表示数组结尾的参数是指向最后一个元素后面的指针。例如代码中的cookies+6,它指向了数组最后一个元素后面的位置。数组名cookies指向第一个元素,cookies+5指向最后一个元素,因此cookies+6指向数组结尾后面的一个位置。将区间传递给函数,告诉函数要处理哪些元素。代码中将cookies+1和cookies+4传递给函数意味着求第2个至第4个元素之和,所以程序输出结果应为12。将cookies和cookies+6传递给函数意味着求整个数组元素之和,所以程序输出结果应为31。

再来看求和函数的实现,首先定义了一个指向常量的指针,然后通过一个循环,常量指针被赋不同的值再相加。可能有同学会疑惑,pt是一个指向常量的指针,怎么可以被赋不同的值。答案是可以的,const int *pt;它只是表示不能通过*pt来改变*pt的值,但可以通过其他方式来改变*pt的值。以下代码是合法的:

int age1 = 5;
int age2 = 10;
const int *pt2 = &age1;
cout << "*pt2: " << *pt2 << endl;
pt2 = &age2;
cout << "*pt2: " << *pt2 << endl;

结果输出如下: 

*pt2通过被赋不同的值,实现了*pt2值的改变。

在函数形参为指针时,将指针参数声明为指向常量数据的指针有两个好处:

  1. 可以避免因无意间修改数据而导致的错误;
  2. 使用const使函数可以处理const和非const实参,否则只能接受非const数据;

因此,如果条件允许,应将指针形参声明为指向const的指针。

2. int * const pt

int age = 10;
int * const pt = &age;
*pt += 2;
cout << "age = " << age << endl;

上面的代码表示pt只能指向age,pt是const,不能指向其他变量,但可以通过*pt来改变age变量的值,上面代码的输出结果为:age = 12。

int * const pt 这种声明在实际编程中很少用。

3. 扩展

const float age = 10;
int *pt = &age;///赋值错误

上面代码中试图将一个常量整型的地址赋给pt,这是非法的,age被声明为常量,其值不可改变。如果age的地址可以被赋给pt,这里pt不是一个指向整型常量的指针,因此可以通过pt指针变量来改变age的值,这就使得两条语句矛盾了,因此age的地址不能被赋值给pt。

相关文章:

  • cadence安装license manager无法开启,显示并行配置不正确
  • 【C语言练习】047. 理解递归与循环的转换
  • 期望是什么:(无数次的均值,结合概率)21/6=3.5
  • C++---string类
  • 编程日志5.10
  • 向量数据库Qdrant的Collection参数配置说明
  • 【嵌入式项目-MCU代码2】
  • day28 python 类与继承
  • 使用Spring Boot与Spring Security构建安全的RESTful API
  • 二叉树的中序遍历 递归调用的完整展开
  • 完整卸载 Fabric Manager 的方法
  • Python海龟绘图(Turtle Graphics)核心函数和关键要点
  • W5500使用ioLibrary库创建DHCP客户端
  • 生产者 - 消费者模式实现方法整理
  • python + streamlink 下载 vimeo 短视频
  • 【Element UI】表单及其验证规则详细
  • DAY 23 训练
  • Python 3.11详细安装步骤(包含安装包)Python 3.11详细图文安装教程
  • Python 基础之函数命名
  • Nginx应用场景详解与配置指南
  • 山东茌平民企巨头实控人省外再出手:斥资16亿拿下山西一宗探矿权
  • 特朗普:将于19日分别与普京和泽连斯基通话
  • 广州医药集团有限公司原党委书记、董事长李楚源被“双开”
  • 信俗与共:清代新疆回疆儒释道庙宇的中华政教
  • 体坛联播|热刺追平单赛季输球纪录,世俱杯或创收20亿美元
  • 美国务卿会见叙利亚外长,沙特等国表示将支持叙利亚重建