指针与const限定符

2023-11-13

const限定符和指针结合起来常见的情况有以下几种。
const int *a;
int const *a;
这两种写法是一样的,
a是一个指向const  int的指针,a所指向的内存单元不可改写,所以(*a)++是不允许的,但a可以改写,所以a++是允许的。
int * const a;  

a是一个指向int型的const指针,*a是可以改写的,但a不允许改写。
int const * const a;
a是一个指向const int型的const指针,因此*a和a都不允许改写。

指向非const变量的指针或者非const变量的地址可以传给指向const变量的指针,编译器可以做隐式类型转换,例如:
char c = 'a';
const char *pc = &c;
但是,指向const变量的指针或者const变量的地址不可以传给指向非const变量的指针,以免透过后者意外改写了前者所指向的内存单元,例如对下面的代码编译器会报警告:
const char c = 'a';
char *pc = &c;
即使不用const限定符也能写出功能正确的程序,但良好的编程习惯应该尽可能多地使用const,因为:
1.const给读代码的人传达非常有用的信息。比如一个函数的参数是
const char *,你在调用这个函数时就可以放心地传给它char *或const char *指针,而不必担心指针所指的内存单元被改写。
2. 尽可能多地使用const限定符,把不该变的都声明成只读,这样可以依靠编译器检查程序中的Bug,防止意外改写数据。
3.const对编译器优化是一个有用的提示,编译器也许会把const变量优化成常量。
字符串字面值通常分配在.rodata段  字符串字面值类似于数组名做右值使用时自动转换成指向首元素的指这种指针应该是const char *

const char *p = "abcd";
const char str1[5] = "abcd";
char str2[5] = "abcd";
printf(p);
printf(str1);
printf(str2);
printf("abcd");

注意上面第一行,如果要定义一个指针指向字符串字面值,这个指针应该是const char *型,如果写成char *p = "abcd";就不好了,有隐患,例如


int main(void)
{
char *p = "abcd";
...
*p = 'A';
...
}

p
指向.rodata段,不允许改写,但编译器不会报错,在运行时会出现段错误 (经过在vc中验证,的确是这样的)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

指针与const限定符 的相关文章

随机推荐

  • MySQL数据库增删改查及安全值守操作

    我在本篇文章中整理了一些MySQL数据库 表 字段的增删改查和安全值守操作的常用语句 以便同学们保存和快捷查询 详细如下 1 用户的查看 创建 删除 以username为Superman password为123123为例 用户的创建cre
  • python模拟登录京东网页

    目标网站 京东网首页登录 目标网址 https www jd com 任务要求 1 导入selenium库 并使用该库驱动Chrom浏览器 完成请求 2 驱动浏览器对象 找到登录按钮 点击 3 在新页面中选择账号登录 4 找到用户名和密码输
  • Ubuntu 安装 Mysql【详细步骤】

    文章目录 主要内容 安装并设置 mysql 安装 mysql 设置 mysql 首次登录数据库 配置远程访问 修改配置文件 mysql 授予权限 重启 mysql 测试远程访问 建立访问连接 workbench 访问 workbench 增
  • [Springboot+Logback]已定义日志路径但仍生成了LOG_PATH_IS_UNDEFIEND文件夹之解决办法

    目录 1 问题描述 2 分析过程 3 解决办法 4 其他 1 问题描述 自己写练习项目的时候 在application yml中定义了logging file path logging file path logs 也在logback sp
  • 松下GF9使用心得

    文章目录 规格参数 关键特征 USB接口充电功能 旋转显示屏 WiFi直连 4K拍摄和后对焦模式 快速指南 机身按键及功能 拍摄模式 屏显信息 拍摄时 回放时 菜单列表 拍摄菜单 动态影像菜单 自定义菜单 设置菜单 回放菜单 核心功能 拍摄
  • Python之struct简介

    一 struct简介 看到struct这么英文单词 大家应该并不陌生 因为c c 中就有struct 在那里struct叫做结构体 在Python中也使用struct 这充分说明了这个struct应该和c c 中的struct有很深的渊源
  • 保姆级教学——集群环境搭建及创建集群

    保姆级教学 集群环境搭建及创建集群 新建虚拟机 一些默认 加载镜像开启虚拟机 在安装位置选择自己目录 然后建立分区 首先添加 挂载点 类型标准分区 文件系统ext4 加载分区 期望给2G 类型标准分区 swap默认 然后剩下47G给 就可以
  • 发布本地Docker镜像到阿里云的Docker Hub

    发布本地Docker镜像到阿里云的Docker Hub 在使用Docker时 有时需要制作自己的Docker镜像 这些镜像可以保存到不同的Docker Hub中 包括Docker官方的和国内的一些Hub 比如阿里云 同时 也可以使用阿里云的
  • 排列组合相关公式讲解(Anm,Cnm等)

    两个性质 1 C n m C n n m 2 C n m C n 1 m C n 1 m 1 编程时可用此递推
  • Python最强学习知识点:面相对象基础语法

    面相对象基础语法 目标 dir 内置函数 定义简单的类 只包含方法 方法中的 self 参数 初始化方法 内置方法和属性 01 dir 内置函数 知道 在 Python 中 对象几乎是无所不在的 我们之前学习的 变量 数据 函数 都是对象
  • 单周期RISC-V架构CPU的设计---设计篇

    目录 一 模块设计 1 pc reg v 1 1 功能说明 1 2 整体框图 1 3 接口列表 1 4 内部信号说明 1 5 关键电路 2 id v 2 1 功能说明 2 2 整体框图 2 3 接口列表 2 4 内部信号说明 2 5 关键电
  • Vim语法检查插件cppSyntaxCheck

    下载cppSyntaxCheck master https github com sjp 1024 Classroom notes blob master cppSyntaxCheck master zip 将解压文件中的cppSyntax
  • 40+野路子学习软件编程记录

    1 软件几乎零基础 机械专业 手机行业项目管理工作 2 疫情期间 闲来无事 突发兴趣 3 有点开窍入门 4 树莓派Linux学习入手 openwrt homeassiant airplay和媒体局域网服务等 5 学习Python读ds18b
  • postgresql导出表结构

    pg dump命令可以导出数据库中的表结构 s 选项用来只导出表结构 而不会导出表中的数据 t 选项用来指定要导出的数据库表 pg dump s t tlb exampledb gt tmp tlb exampledb是数据库 tlb是ex
  • MySQL对大小写敏感吗

    见字如面 见标题知内容 你有遇到过因为MYSQL对大小写敏感而被坑的体验吗 之前看过阿里巴巴Java开发手册 在MySql建表规约里有看到 强制 表名 字段名必须使用小写字母或数字 禁止出现数字开头 禁止两个下划线中间只 出现数字 数据库字
  • Python代码:根据txt文件批量提取图片

    个人微信公众号 AI研习图书馆 欢迎关注 深度学习知识及资源分享 学习交流 共同进步 1 介绍 Python代码 根据txt文件批量提取图片并保存至另一文件夹 用于深度学习 图片数据预处理 2 Python代码 实现方案一 import s
  • vue点击按钮跳转新页面

    const str location href split 0 window open str router的name
  • java自动登录 selenium 自动登录并获取cookie

    选择操作网页 我用的edge 谷歌我的版本太高没有对应的驱动 下载Edge的驱动程序 直接解压就好里面只有一个 exe文件 https developer microsoft com en us microsoft edge tools w
  • bluez调试笔记

    蓝牙系列 bluez调试笔记 weixin 41069709的博客 CSDN博客 bluezbluez移植https blog csdn net weixin 41069709 article details 125168114 spm 1
  • 指针与const限定符

    const限定符和指针结合起来常见的情况有以下几种 const int a int const a 这两种写法是一样的 a是一个指向const int的指针 a所指向的内存单元不可改写 所以 a 是不允许的 但a可以改写 所以a 是允许的