const 与define 创建符号常量的 用法与区别
一、define 的用法:
在c语言中我经常会看到 :#define PI 12 ,这是创建了一个符号常量,这里面要注意没有那个等于号“=”;
二、const 的用法:
1、const 也可以来创建符号常量,但是const 的用法比define 在用法方面更加灵活,它可以创建const数组、const 指针、指向const 的指针,
const int RATE = 100; 这里可以看出一个区别,在const 创建的符号常量赋值时有一个“=”,这个不要被忽列掉,不然会出错的;这里举几个例子:
const 数组:const int days[10]={1,2,3,4,5,6,7,,8,9,10};注意:之后在使用这个数组时,不能修改数组元素的值,例如:days[9]=1000;这将会产生一个错误。
const 指针:double rate[2]={1,2};
const double *pd=rate(创建了一个指向了const的指针pd); *pd=44(这将产生一个错误),而rate[0]=22(这个是允许的,因为rate未被const限定)
所以说,指向const 的指针不能用来修改值,但是我们可以让pd指向别处(pd++),也就是指向了rate[1],这个是被允许的;
2、在const 创建的指针赋值时要注意几点:
int rate[4]={1,2,3,4};
const int tu[4]={5,6,7,8};
const int * pc=rate;(这个赋值有效), pc=tu (有效) pc=&rate[2](有效)
int * pcc=rate;(有效) ,pcc=tu(这个赋值无效),pcc=&rate[2];(有效);
所以说,把const 数据或非const 数据的地址初始化为指向const 的指针或为其赋值是合法的,不能把const数据地址赋给普通指针;
3、const 的其它用法:
声明一个不能指向别处的指针,注意const 的位置就可以了:
double rate[4]={1.2,1.3,1.4,1.5}
double *const pc =rare;
pc=&rate[3](这个是不被允许的)
*pc=22.44(这个修改值是被允许的,但是只能修改第一个值,也就是初始化那个地址上的值)
创建指针的时候,可以使用两次const,该指针既不能修改它指向的地址,也不能修改指向地址上的值:
double rate[4]={2.3,5.6,7.8,8.9}
const double * const pc =rate;
pc=&rate[2](这个不允许指向别处)
*pc=86.3(这个也不被允许修改数组中的值)
说了这么多,总结一下:
在运用const 的时候,关键是注意它在那个位置上,在不同位置上有不同的用法,而且在赋值时,类型要对头,不能把const 的数据赋值给非cosnt 数据,但是可以让非const 数据赋值给const数据。
const 与define 创建符号常量的 用法与区别的更多相关文章
- const和define在值定义上的区别
(1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. (2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开. const常量有 ...
- const与#define、结构体对齐、函数重载name mangling、new/delete 等
一.bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC++中为1个字节. 声明方式:bool result; result ...
- C++ const、volatile、mutable的用法 (转)
const.volatile.mutable的用法 鸣谢作者: http://blog.csdn.net/wuliming_sc/article/details/3717017 const修饰普通 ...
- const和#define常量的区别
(1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. (2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开. const常量有 ...
- 函数定义从零开始学C++之从C到C++(一):const与#define、结构体对齐、函数重载name mangling、new/delete 等
今天一直在学习函数定义之类的问题,下午正好有机会和大家共享一下. 一.bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC+ ...
- C++ 中 const和define的区别
来源网址:http://wujiangping.blog.163.com/blog/static/195182011201255115125205/ 请区别用#define命令定义的符号常量和用con ...
- const、volatile、mutable的用法
http://blog.csdn.net/wuliming_sc/article/details/3717017 const.volatile.mutable的用法 const修饰普通变量和指针 co ...
- const 和 #define区别_fenglovel_新浪博客
const 和 #define区别 (2012-12-11 14:14:07) 转载▼ 标签: 杂谈 (1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使 ...
- const 和 #define区别
(1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. (2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开. const常量有 ...
随机推荐
- sql中问号是干什么的??
第一次在后台 程序中遇到sql语句中的问号: /** * * 方法描述 : 通过账号id更新该账号状态 * @param state 状态 * @param id 账号id */ @Modifying ...
- java算法 第七届 蓝桥杯B组(题+答案) 3.凑算式
3.凑算式 (结果填空) B DEFA + --- + ------- = 10 C GHI (如果显示有问题,可以参见[图1.jpg]) 这个算式中A~ ...
- Lucene介绍及简单入门案例(集成ik分词器)
介绍 Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和 ...
- ArcGIS js api开发环境配置
转自https://blog.csdn.net/lovecarpenter/article/details/53713481#3%E9%85%8D%E7%BD%AEarcgis-api%E5%AE%9 ...
- 通过Scanner从控制台获取数据
----------siwuxie095 Scanner类用于扫描从控制台输入的数据,可以接收字符串和基本数据类型的数据 Scanner类位于 java.util.Scanner 包中 Scanner ...
- spring4-1-Spring的简单介绍
Spring4.0 是 Spring 推出的一个重大版本升级,进一步加强了 Sring 作为 Java 领域第一开源平台的地位.Spring4.0 引入了众多 Java 开发者期盼的新特性,如泛型依赖 ...
- code1006 等差数列
我绞尽脑汁想一个更好的算法,然而不能如愿,只好写一个n^3的了 很简单,就是暴力搜索(还好n<100) 先排序,然后循环i=1ton,j=i+1ton 把a[i]a[j]确定为等差数列开始的两个 ...
- HBase表的memstore与集群memstore
一直有一个问题,今天调查了一下源码算是明白了. ===问题=== 通过java api(如下代码所示)在创建表的时候,可以通过setMemStoreFlushSize函数来指定memstore的大小, ...
- C# WebService中任务处理线程创建子线程后
protected void WriteLog(string message) { lock (lockObject) { var file = System.IO.File.AppendText(& ...
- python中return的用法
def testReturn(x): if x > 10000: return print "test return!!" #这句话永远不会得到执行 elif x > ...