C/C++里的const(2)
对于如下几个语句,哪些定义相同?哪些定义不同?哪些数据可修改?哪些数据不可修改呢?
const int a;
int const a;
const int *a;
int *const a;
int const *const a;
在C/C++中,const是一个数据类型修饰符,常见的还有short、long、unsigned、static、extern等,定义变量的方式采用:
(修饰符+数据类型) 变量名称
注意:如果有修饰符,则修饰符和数据类型的位置不影响变量的定义,比如int short和 short int语义是一样的。
因此,const int a 与 int const a 所表达的意思相同,都是定义了一个const int型的变量,数值不可修改。
对于指针变量类型的理解:
首先()、[]、*这三个符号的优先级依次降低,所以下面两个语句意思不同:
int *a[]; // 定义了一个10位数组,每个成员都是指向int的指针
int (*a)[];//定义了一个指针,指针指向了一个有10个int型的数组
同时需要记住指针作用是从右往左。
在回过头来看后三个语句,就很容易发现:
const int *a表示a是一个指针,指向了const int型,指向的数据不可修改;
int *const a表示const a 是一个指针,指向了一个int型,指向的数据可以修改,指针不能指向别的地址了;
int const *const a表示const a是一个指针,指向了一个const int 型,指向的数据不可修改,指针也不能指向别的地址了。
注意:
typedef void* VP;
const VP ptr;
const void *ptr;
两个ptr的定义是否相同?答案是不同。typedef定义的是一种新的数据类型,因此const VP ptr 与 VP const ptr语义相同,所以在这句中ptr是一个const类型,存储在代码段里;而const void *ptr是一个普通指针,指向了const void类型的数据,它可以指向别的地方,存储在数据段里。因此两个语句存储位置不一样。
为什么要用const?
- 给别的程序员传递一种信息:不要修改这个值;
- 有可能让编译器产生精简的代码?减少bug?(目前不太理解这句话)
- 合理保护只读数据;
使用位置:
- 定义常量,防止被修改;
- 函数参数,防止函数修改作为函数参数的变量值
- 在C++中,类成员函数的使用
C/C++里的const(2)的更多相关文章
- C/C++里的const(1)
首先来看这样一段程序: #include<iostream> using namespace std; int main(){ char *s = "hello world&qu ...
- 类里面的非static const成员
类里面的成员变量可以用const修饰,在只用const不用static修饰的情况下,这种使用的限制比较多 (1)不能定义处初始化,必须在类的构造函数初始化列表里面初始化(虽然在vs中,可以在定义处初始 ...
- 为什么为 const 变量重新赋值不是个静态错误
const 和 let 的唯一区别就是用 const 声明的变量不能被重新赋值(只读变量),比如像下面这样就会报错: const foo = 1 foo = 2 // TypeError: Assig ...
- C++中的const和指针组合
在C++里,const修饰指针有以下三种情况 (1)指针常量:即指向常量的指针 const int *p或者int const *p const在*前,,可以这样理解它的功能,因为const在*前, ...
- (转) C++ static、const和static const 以及它们的初始化
const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. static表示的是静态的.类的静态成员函数.静态成员变量是和类相关的,而不是和类的 ...
- C++ static、const和static const 以及它们的初始化
转自C++ static.const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. s ...
- C++中如何修改const变量
一.结论 声明:不同于C语言的const变量修改问题(可以通过指针间接修改const变量的值),这里只讨论C++ 里的const. C++ const 修饰符,表示常量,即如果以后保证不会修改则声 ...
- KEIL C51中const和code的使用
code是KEIL C51 扩展的关键字,用code修饰的变量将会被放到CODE区里.但C语里的const关键字好像也有定义不能改变的变量的功能,这两个关键字有什么区别呢?在帮助手册里查找const, ...
- const形参与非const形参
在程序设计中我们会经常调用函数,调用函数就会涉及参数的问题,那么在形参列表中const形参与非const形参对传递过来的实参有什么要求呢? 先来看一个简单的例子: #include <iostr ...
随机推荐
- Selenium驱动Firefox浏览器
用Maven构建Selenium依赖: <dependency> <groupId>org.seleniumhq.selenium</groupId> <ar ...
- Visual Studio Code 配置Go 开发环境最简单的方法!!!
由于大家都知道的原因,在国内如果想访问go等各种资源,都会遇到某种不可预知的神奇问题.导致在VS Code中安装 go 各种插件都会失败. 于是乎,网上就出现了各种各样的解决方案:什么手动git cl ...
- DFS(8)——poj2034Anti-prime Sequences
一.题目回顾 题目链接:Anti-prime Sequences Sample Input 1 10 2 1 10 3 1 10 5 40 60 7 0 0 0 Sample Output 1,3 ...
- Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/xxx项目名]]
可能是web.xml中的一些配置导致Tomcat启动失败,把web.xml中除 <welcome-file-list>外的全部配置删除后,就能正常启动Tomact了. 具体什么原因还不清楚 ...
- 用OneNote写博客的方法
1.进入OneNote要发布博客的分区然后点击菜单栏中的文件 2.点击发送至博客 3.这时候会启动word程序弹出下面的对话框(如果你从未设置过)点击立即注册 ...
- htm,html,xhtml,xml,xsl,dhtml,shtm和shtml的区分
介绍一下htm,html,xhtml,xml,shtml的区分,以下内容来自百度后的知识整理. HTML和htm: HTML(Hypertext Markup Language)超文本传输语言,是ww ...
- 【转载】Linux升级NTPD服务器-编译安装ntp-4.2.8p12与配置
[转载]Linux升级NTPD服务器-编译安装ntp-4.2.8p12与配置 1. 系统与软件版本 1.1 系统版本 rhel6.4(Red Hat Enterprise Linux Server r ...
- 【Linux】- ls命令详解
1 命令功能: 列出当前目录下或者指定目录下的所有文件和目录,ls是list的缩写. 2 命令语法: ls [选项] [目录名] #注:[]中的内容为非必选项 3 命令选项: -a 列出目录下 ...
- nginx1.10.3+php5.6+mysql5.7.0
第一步安装nginx1.10.3 优化nginx的介绍:jemalloc https://ideas.spkcn.com/software/os/linux/577.html 预先安装autoconf ...
- vue2.0中动画
#vue2.0中css动画不显示的坑: transition中包含的两个标签如果相同(此处都是p标签),需要为元素指定key.如果标签名不同的话,不指定key也可以出现动画效果. #vue2.0中js ...