顶层const指针type * const p;底层const指针type const* p

C++ const关键字深度解析:从基础语义到高级应用实战 在C++编程中,类型限定符是确保代码安全性和表达意图的重要工具。const作为核心的类型限定符,其根本原理是为变量、函数参数和成员函数等提供编译期的只读保护,防止意外修改。这一机制的技术价值在于提升代码的健壮性、清晰度,并辅助编译器进行优化。在实际应用场景中,const与指针、引用、函数等结合,形成了顶层const与底层const、常量引用、常量成员函数等关键概念,是设计稳定接口和实现线程安全的基础。理解const的正确使用,特别是其在指针组合中的细微差别和常量成员函数的规则,是区分C++程序员水平的关键, 阅读详情

顶层const指针不能改指向(如同顶层const常量不能改值),当指向变量时可以通过顶层const指针改变量的值,因此,顶层const指针不能指向常量;
底层const指着可以改指向,但不能通过其改所指对象的值

// TopBottomconst.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
	int n=9;
	const int cn=n;
	int const *pcn=&n;   //底层const指针指向变量
	*pcn=8; //err"表达式必须是可修改的左值" 即不允许通过底层const改(赋值)指向对象 即使是指向变量
	pcn=&cn; //底层const指针指向常量  (底层const可以改指向)
	*pcn=8;  //err"表达式必须是可修改的左值" 即不允许通过底层const改(赋值)指向对象 指向常量更不应该改值
	int *const pcn3=&n;  //顶层const指针指向变量
	*pcn3=8;             //顶层const指针指向变量时可以通过其修改指向对象
	pcn3=&cn;//err"表达式必须是可修改的左值" 即顶层const不允许改指向(值)
	int const cn2=n;
	int *const pcn4=&cn2; //err"const int*类型的值不能初始化int*const类型的实体"
	                      //即 顶层const指针不能指向常量(顶层const对象)

	system("pause");
	return 0;
}
#include <QCoreApplication>
#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    char *pch=new char;
    strcpy(pch,"Hello Qt!\0");
//    ostream std::cout;
    std::cout<<*pch<<std::endl;
    const char *pch2="Hello Qt! 2\0";
    std::cout<<*pch2<<std::endl;
    strcpy(pch,"Hello Cpp!\0");
    std::cout<<*pch2<<std::endl;

    char *const pch3=new char;
    strcpy(pch3,"Hello Qt! 3\0");
    pch3[0]='h'; //顶层指针改值,没毛病
    std::cout<<*pch3<<std::endl;
    pch3 = pch; //顶层指针尝试改指向,报错"assignment of read-only variable 'pch3' "
    std::cout<<*pch3<<std::endl;

    const char str[] = "Hello Qt! 4\0";
    const char *pch4=str;
//    strcpy(pch4,str);
    pch4[0]='h';//底层指针尝试改值,报错"assignment of read-only location '* pch4' "
    std::cout<<*pch4<<std::endl;
    pch4=pch;//底层指针尝试改指向,没毛病

    const char * const pch5=str;
    pch5[0]='h';//顶层常指针尝试改值,报错"assignment of read-only location '*(const char*)pch5' "
    std::cout<<*pch5<<std::endl;
    pch5=pch;//顶层常指针尝试改指向,报错"assignment of read-only variable 'pch5' "

    return a.exec();
}

C/C++复杂声明解析:螺旋移动法与const限定符深度指南 在C/C++编程中,理解变量和函数的声明是掌握类型系统的基础。声明语法定义了标识符的类型、存储类及作用域,其核心在于解析操作符(如*、[]、())的绑定顺序与结合性。螺旋移动法(又称顺时针/左右法则)提供了一套系统化的视觉解析路径,通过从标识符出发,按‘向右→向内→向左’的优先级顺序拆解嵌套的指针、数组和函数声明,将编译器理解声明的方式可视化。这一方法的技术价值在于,它能将晦涩的语法规则转化为可操作的步骤,显著降低学习指针、函数指针及多级间接寻址的认知门槛,是深入理解内存模型和类型安全的有效训练工具。在工程 阅读详情

相关推荐

【FreeRTOS】FreeRTOS 源码学习笔记 (3)队列 及 xQueueGenericSend分析

引言 本篇又不写调度器了,准备先整理整理“队列“,无他,就觉得这个很有用,自己写应用层代码的时候,队列要用的比较多,之前一直用一个自己写的环形buffer,里面nReadIndex,nWriteIndex,nFreeIndex来管理总觉得不够“官方”,这次看到一个如此成熟的队列,还是忍不住先分析一下。 ...

YoYo的桃子树 5103

26-指针的本质分析

注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。 测试环境:Ubuntu 10.10 GCC版本:4.4.5 一、变量回顾 程序中的变量只是一段存储空间的别名,那么是不是必须通过这个别名才能使用这段存储空间? 二、思考: 下面的程序输出什么?为什么? int i = 5; int* p = &i; printf("%d,%p\n"...

第一大剑豪——索隆 460

二、频率调制光谱(FMS)技术——error信号的数学模型及其他推论

一些推论。

qq_41111336的博客 1605

Qt chat1

const* and *const Suppose that we have a pointer ptr that is storing the address of a variable vbl: Type* ptr = &vbl; When using a pointer, two objects are involved: the pointer itself and the obje

记录自由程序的日子 836

川崎机器人 AS语言基础运动指令表

    功能简介 动作方式 参考坐标系 位置特性 X,Y,Z 角度特性 O,A,T 指令格式(距离单位毫米,时间单位秒,角度单位度 示例1 示例2 运 动 指 令 JMOVE 以关节移动到目标点 关节移动方式 基础坐标系 不受控 伪随机动作 JMOVE 目标点 JMOVE #yd JMOVE put1 LMOVE 以直线移动到目标点 直线移动方式

喜欢自学并分享经验的技术宅 9348

自学篇--使用keil5.23创建一个stm32工程并编译(固件包自带版本)

之前在本科学习阶段学习过一点51单片机的知识,可是因为基本没有实践过几次现在已经完全忘记了。。前几天老师突然丢给我几个板子说让我把程序编译、烧写环境装好,当时我就震惊了,不过经过三四天的自我摸索,之后参考他人的学习经验,现在已经基本能处理这个问题了,所以为了方便后面的学者,主要也是为了把自己这几天的学习成果记录一下,我在这里把这个过程写下来。(因为刚刚接触,很多原理性的东西都还不懂,只是一个操作步

yang_csdnForOBTS的博客 8659

Qt

Widget::Widget(QWidget *parent):QWidget(parent) { b1.setParent(this); b1.setText("close"); b1.move(100,100); b2=new QPushButton(this); b2->setText("b2"); connect(&b1,&QPushButton

LC900730的博客 731

手把手教你用8位单片机IO口直接驱动WS2812灯带(附完整代码和避坑指南)

本文详细介绍了如何使用8位单片机IO口直接驱动WS2812灯带,包括硬件准备、时序生成、色彩引擎与特效算法的实现,以及调试技巧与性能优化。通过汇编语言优化和精确时序控制,实现高效的LED驱动和炫酷的彩虹灯效,适合嵌入式开发者和硬件爱好者参考。

weixin_42696271的博客 304

C语言限定符

C语言的限定符包括const、volatile、restrict。

FuYu5228的博客 964

2021电子科技大学分布式系统期末考点精析与实战解析

本文深入解析2021年电子科技大学分布式系统期末考试核心考点,包括分布式事务、时钟同步、GFS架构等高频内容。基于回忆版试题,提供实战解析与应试技巧,帮助考生高效复习。重点涵盖两阶段提交、Cristian算法等关键技术,适合计算机专业学生备考参考。

weixin_29251131的博客 539

Android存储方案对比(SharedPreferences 、 MMKV 、 DataStore)

简介:本文介绍了Android开发中常用的键值对存储方案,包括SharedPreferences、MMKV和DataStore,并且对比了它们在性能、并发处理、易用性和稳定性上的特点。通过实际代码示例,帮助开发者根据项目需求选择最适合的存储方案,提升应用性能和用户体验。

LiuYong_01的博客 1784

顶层const & 底层const

顶层const & 底层const 个人理解:顶层cosnt 就是不影响变量类型,作为修饰符的存在。底层则会影响到变量类型 例如: int *pi; //这是一个int *类型的变量,一个指向int型的指针。 int *const p1; //这还是一个int *类型的变量(首先p1是一个指针类型,指向的是int类型的值。才不管你这个变量是不是有const修饰符) ...

weixin_30384031的博客 196

uniapp [全端兼容] - 实现接入使用天地图及卫星视图切换功能,在国家天地图上自由切换地图显示类型(卫星视图/地形视图/卫星混合/地形混合/普通视图)天地图切换视图显示改成卫星风格,切换地图图层

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,天地图,视图,卫星,地图类型切换,uniAPP天地图,改成卫星视角,在线地图切换,来回切换卫星图,天地图如何实现来回切换卫星图,地形图,卫星视图,VUE3引入天地图卫星版,详细教程示例源码代码,天地图切换卫星用什么api,卫星视角API方法,vue3卫星天地图,能改地图的显示方式,vue3中使用天地图自定义样式切换地图图层,切换报错,加载出错,卫星图太卡,地图图层更换,vue3安装集成天地图详细示例源

🏆 前端领域优质创作者 1万+

【C++---const引用】数组进行指针引用传递给函数error: non-const lvalue reference of type ‘int*&‘ to an rvalue

【const引用】数组进行指针引用传递给函数时出错 error: cannot bind non-const lvalue reference of type ‘int*&’ to an rvalue of type ‘int*’|`关于临时量关于常量引用(const的引用)const引用的对象不是不能被修改了吗,这里为什么被修改了?不是说是const引用吗?为什么又变成了引用所绑定的指针的【顶层const】?事实上:不使用常量引用会极大限制函数所能接受的实参类型,(因为我们)不能把const对象、

IDoWhatIDo_92761的博客 2120

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

转换成const_C/C++变量类型识别方法与顶层const和底层const

Recognise of Type And Top-Low-Level of Const for CPP文章导读1.几个例子2.变量类型申明与识别方法3.顶层(Top-Level) const 和 底层(Low-Level) const 的分析4.强制类型转换的类型识别5.避免复杂类型申明的建议与方法6.最后总结7.文章的解读视频链接1.几个例子(后面会解释)const int (*a)[10];...

weixin_35198152的博客 688

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C++中 const与constexpr的详细解析

本文详细解析了C++中const与constexpr的区别和使用场景。const用于定义不可修改的常量,强调运行时确定性和防止意外修改;constexpr则要求编译期确定值,获得更好的优化效果。文章通过对比表展示了二者的核心差异,并深入讲解了顶层const(指针地址不可变)和底层const(指向数据不可变)的概念与组合用法。特别分析了constexpr const type*这种特殊指针的双重约束特性,指出其与双层const的相似性及关键区别,强调全局和局部static变量在编译期地址确定性的不同。最后建议

轩辰的博客 951

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C++ const关键字深度解析:从基础语法到高级应用实战

在C++编程中,常量(const)和常量表达式(constexpr)是确保代码安全性和表达意图的核心机制。const通过类型系统在编译期施加约束,承诺数据的不变性,编译器据此进行严格的检查,从而将潜在的运行时错误提前暴露。这一机制的技术价值在于提升代码的健壮性、可读性和可维护性,是实现资源安全管理和接口契约设计的重要基础。其应用场景广泛,从定义配置参数、保护函数参数不被意外修改,到设计常量成员函数以明确对象状态的可变性。特别是在处理指针和引用时,理解顶层const与底层const的区别至关重要,这直接关系到

cuankuangzhong6373的博客 391

Android C++系列:C++最佳实践5const

本文介绍了const与宏定义常量的区别,以及const修饰变量的注意事项,绑定常量的引用、指向常量的指针和常量指针。并介绍了顶层const与底层const的区别。

轻口味的专栏 1526

C++ const关键字深度解析:从常量定义到代码安全承诺

在C++编程中,常量定义与类型安全是构建健壮软件的基础。const关键字通过编译期检查机制,为变量、函数参数和成员函数提供不变性保证,其核心原理在于建立程序员与编译器之间的“契约”。这一特性不仅提升了代码的健壮性和可读性,还在多线程安全、接口设计等领域体现重要技术价值。通过理解const修饰指针时的“右左法则”以及顶层const与底层const的区别,开发者能更精准地控制数据访问权限。在实际应用场景中,const广泛用于函数参数传递、类成员函数修饰以及常量引用绑定,是实现“常量正确性”的关键。本文聚焦C++

weixin_30252709的博客 430

C++ 笔记:引用、指针和 const 限定符

引用、指针和 const 限定符引用指针`const` 限定符对 `const` 的引用指向 `const` 的指针指向非常量的 `const` 指针指向 `const` 的 `const` 指针顶层 `const` 引用 引用必须初始化,也就是说,引用从“出生”开始就必须绑定至另一个对象,且必须“从一而终” 引用必须绑定至对象,而不能绑定至字面值或表达式计算结果 引用的类型要和其绑定的对象严格...

InGeniX 530

深入理解C++ const:从语法到高级应用与性能优化

在C++编程中,类型系统是确保代码安全性和表达力的核心机制之一。const作为类型限定符,其核心原理是为变量、函数参数、成员函数等提供“不可修改”的保证,从而在编译期捕获潜在的错误,增强代码的健壮性。这一特性在现代软件开发中具有重要价值,它不仅是实现常量正确性的基础,还能辅助编译器进行优化,并广泛应用于API设计、资源管理和并发编程等场景。特别是在函数参数传递中,使用const引用能有效避免不必要的拷贝,提升性能。本文聚焦于C++ const关键字的深度解析,系统梳理了顶层const与底层const的区别、

weixin_34160277的博客 622

C++17 std::as_const:安全添加const限定的实用工具详解

在C++编程中,const正确性是保证代码健壮性的核心概念,它通过编译时检查防止对数据的意外修改。其原理是为变量或对象添加不可变性约束,编译器据此进行类型检查。这一特性在工程实践中价值显著,能提升代码安全性、可读性和可维护性,是多线程安全编程的基础之一。常见的应用场景包括定义配置参数、传递只读函数参数、实现const成员函数等。针对非const对象临时需要只读视图的特定需求,C++17标准库引入了std::as_const这一轻量级工具函数,它提供了一种类型安全且意图清晰的方式,将非const左值转换为co

weixin_34101784的博客 395

深入理解C++ const:从语法到实战的常量正确性指南

在C++编程中,常量与只读访问控制是构建健壮、可维护软件的核心概念。其原理在于通过类型系统在编译期施加约束,限定数据的可变性,从而明确程序各部分的访问权限。这一机制的技术价值在于提升代码的安全性、可读性,并辅助编译器进行优化。在实际应用场景中,它广泛用于定义配置参数、保护函数参数不被意外修改、设计线程安全的接口以及实现资源的高效只读访问。本文聚焦于C++的const关键字,通过剖析指针与引用的常量性、const成员函数以及未定义行为等核心议题,并结合类型推断、mutable成员等高级用法,系统阐述如何在实际

weixin_33508411的博客 289

C++ Primer 笔记五 const限定符

const限定符     const是一种类型修饰符,用于说明永不改变的对象。const对象一旦定义,就无法再赋新值,所以必须被初始化。 const int ival = get_size(); // 正确:运行时初始化 const int ival1 = 42; // 正确:编译时初始化 // error: uninitialized const 'ival2' const int iva...

笔记 349

const总结

成员函数声明中(空)参数列表后的const指出这些函数不会修改成员的状态。 当const成员函数定义在类外时,必须使用const后缀 class Date{ int d,m,y; public: int day() const {return d;} int month() const {return m;} int month()const {return m;} int year() const; } int Date::year()const { return ++y; /.

weixin_45792025的博客 189
上一篇: Windows消息与内嵌函数名或自定义函数名响应函数之间关联的语法其实是宏
下一篇: 函数不能返回局部变量的引用,但类的引用数据成员却可以引用构造函数的形参(局部变量),然而无意义
HayPinF
博客等级 码龄9年 175粉丝 140原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值