博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++里的const(2)
阅读量:7238 次
发布时间:2019-06-29

本文共 1104 字,大约阅读时间需要 3 分钟。

对于如下几个语句,哪些定义相同?哪些定义不同?哪些数据可修改?哪些数据不可修改呢?

1 const int a;2 int const a;3 const int *a;4 int *const a;5 int const *const a;

在C/C++中,const是一个数据类型修饰符,常见的还有short、long、unsigned、static、extern等,定义变量的方式采用:

(修饰符+数据类型) 变量名称

注意:如果有修饰符,则修饰符和数据类型的位置不影响变量的定义,比如int short和 short int语义是一样的。

因此,const int a 与 int const a 所表达的意思相同,都是定义了一个const int型的变量,数值不可修改。

对于指针变量类型的理解:

首先()、[]、*这三个符号的优先级依次降低,所以下面两个语句意思不同:

1 int *a[10]; // 定义了一个10位数组,每个成员都是指向int的指针2 int (*a)[10];//定义了一个指针,指针指向了一个有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?

  1. 给别的程序员传递一种信息:不要修改这个值;
  2. 有可能让编译器产生精简的代码?减少bug?(目前不太理解这句话)
  3. 合理保护只读数据;

使用位置:

  1. 定义常量,防止被修改;
  2. 函数参数,防止函数修改作为函数参数的变量值
  3. 在C++中,类成员函数的使用

转载于:https://www.cnblogs.com/jacklu/p/4433544.html

你可能感兴趣的文章
Linq一对多联合查询
查看>>
CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维
查看>>
在设计DJANGO用户更改密码时,出现NoReverseMatch at /account/password-change/这种妖精如何办?...
查看>>
android中保存一个ArrayList到SharedPreferences的方法
查看>>
NOIP模拟赛20161016R1
查看>>
SQL Server 常用命令
查看>>
ElasticSearch插件安装Head、Kopf与Bigdesk
查看>>
安卓开发必备知识体系:安卓篇
查看>>
python列表推导式详解 列表推导式详解 字典推导式 详解 集合推导式详解 嵌套列表推导式详解...
查看>>
What's the difference between @Component, @Repository & @Service annotations in Spring?
查看>>
Android 开发中 iBeacon的使用
查看>>
分布式搜索引擎Elasticsearch的查询与过滤
查看>>
Docker Network containers
查看>>
(转) How to Train a GAN? Tips and tricks to make GANs work
查看>>
CMS系统的实现图
查看>>
软件门外汉的入门进阶
查看>>
360度舵机和180度舵机控制方法小结(转)
查看>>
Disable Maven Nature和disable workspace resolution
查看>>
mysql大数据量分页查询优化
查看>>
JS框架设计之对象扩展一种子模块
查看>>