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

【和春笋一起学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。

http://www.xdnf.cn/news/6982.html

相关文章:

  • 50个Python常用的模块,配对应的官网文档!!
  • 专业技术知识和技能,机械泵场效应管短路维修方法主要步骤方法
  • Linux_ELF文件
  • 【EDA软件】【联合Modelsim仿真使用方法】
  • 数据结构*优先级队列(堆)
  • 【笔记】正弦量的相量表示
  • 字体样式集合
  • (4)python爬虫--JsonPath
  • 框架之下再看HTTP请求对接后端method
  • 深度学习模型基本框架
  • Node.js 源码概览
  • 软件调试纵横谈-16-堆概要
  • 【Linux网络与网络编程】12.NAT技术内网穿透代理服务
  • 使用 Kaniko来构建镜像
  • C# 中的锁
  • 接口自动化测试总结
  • 高并发内存池------内存释放
  • C#与KepOPC通讯
  • 嵌入式学习笔记 - STM32定时器的输入通道与时钟源
  • Rust 学习笔记:关于 HashMap 的练习题
  • Flink 的任务槽和槽共享
  • c++从入门到精通(五)--异常处理,命名空间,多继承与虚继承
  • 第一次经历项目上线
  • HarmonyOS NEXT~鸿蒙应用上架指南:HarmonyOS应用发布全流程解析
  • 大型语言模型中的QKV与多头注意力机制解析
  • 前端面经12 函数柯里化
  • redisson分布式锁实现原理归纳总结
  • 注册表设置windows背景护眼色
  • 机器学习,深度学习,神经网络,深度神经网络之间有何区别?
  • 【Linux网络】DNS与ICMP