const的一些用法和理解
首先先说一下const常量的用处,我们知道宏定义#define是没有数据类型的,编译器在编译的时候,不会对宏常量进行类型检查,只进行简单的字符串替换,字符串替换时极易产生意想不到的错误,所以这个时候,我们用需要用到某种声明了数据类型的常量,即const常量。
在声明语句中,只要将const类型修饰符放在类型名之前,即可将类型名后的标识符声明为具有该类型的const常量。由于编译器将其放在只读存储区,不允许在程序中改变其值,因此const常量只能在定义时赋初值,例如:const
double PI =3.1415926;(《C语言程序设计(第3版)》)
如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助。
1.const修饰变量
我们首先看下面一道题目:
下面哪两个是等同的:
int b;
const int *a = &b; //
const * int a = &b; //
const int* const a = &b; //
int const* const a = &b; //
答案是3、4,为什么呢?我们依次来看:
第一个:a是指针,指向int,这个int是静态的,这个const修饰的是int
第二个:语法错误,是不存在这种写法的
第三个:a是静态指针(第二个const修饰),指向int,这个int是静态的(第一个const修饰)
第四个:a是静态指针(第二个const修饰),指向一个静态的变量(第一个const修饰,这个变量是int的)
所以3、4是相等的。
const修饰变量时:
(1)只有一个const,如果const位于*左侧,表示指针所值数据是常量,不能通过解引用修改该数据;指针本身是变量,可以指向其他的内存地址。
(2)只有一个const,如果const位于*右侧,表示指针本事是常量,不能指向其他内存地址;指针所值的数据可以通过解引用修改。
(3)两个const,*左右各一个,表示指针和指针所指数据都不能修改。
2.const修饰函数参数
传递过来的参数在函数内也是不可以改变的,例如:
void fun(const int a){
a = ; //编译出错
}
3.const修饰函数返回值
3.1 指针传递
如果返回值为const数据类型,未const的指针,返回值也必须一样。因为指针指向的数据是不能修改的,通过这段代码来看一看:
#include<stdio.h> const int *fun(){
int b=;
int *a=&b; return a;
} int main()
{
const int *a=fun();
//int *a=fun(); //编译错误
printf("%d\n",*a); return ;
}
3.2 按值传递
如果函数返回值采用“值传递的方式”,由于在此过程中会产生一个副本,所以加const是没有任何意义的,因此,对于值传递来说,加const没有太多意义。
例如:
不要写类似const int fun()的函数,这样写,还不如不加const。
4.const的重要作用
在用指针进行传递参数时,常常用const加以修饰,这样可以保证传递来的参数不被修改,这样可以大大提高程序的健壮性。
参考原文传送门:https://blog.csdn.net/lai_li/article/details/51154426
const的一些用法和理解的更多相关文章
- HAVING COUNT(*) > 1的用法和理解
HAVING COUNT(*) > 1的用法和理解 作用是保留包含多行的组. SELECT class.STUDENT_CODE FROM crm_class_schedule class GR ...
- 【转】关于 Goroutine Channel Select 的用法和理解
原文:https://blog.csdn.net/jfkidear/article/details/88661693 ----------------------------------------- ...
- RESTful转载,多看几遍就理解了写点自己的看法和理解
要理解资源路由就要理解什么是RESTful.如果一个架构符合REST(即Representational State Transfer的缩写,意为表现层状态转化)原则,就称它为RESTful架构. R ...
- @Configuration和@Bean的用法和理解
spring Boot提倡约定优于配置,如何将类的生命周期交给spring 1.第一种自己写的类,Controller,Service. 用@controller @service即可 2.第二种,集 ...
- 关于微信小程序的一些看法和理解
最近做了几个小时的调研,微信小程序 微信小程序是可以理解成在微信中的APP,他的目标是APP的替代者,由于目前的APP主要区分安卓和IOS,或者其他平台, 那么微信小程序的平台在微信,在任何一个手机系 ...
- oc const 关键字 对指针的理解
/* int const *p; *p是常量, p是变量 const int *p; *p是常量, p是变量 int * const p; *p是变量, p是常量 const int * const ...
- Python中__init__的用法和理解
在Python中定义类经常会用到__init__函数(方法),首先需要理解的是,两个下划线开头的函数是声明该属性为私有,不能在类的外部被使用或访问.而__init__函数(方法)支持带参数类的初始化, ...
- 【转】repo 的一些用法和理解-不错
原文网址:http://blog.csdn.net/yasin_lee/article/details/5975068 repo的用法(zz) 注:repo只是google用Python脚本写的调用g ...
- delphi中move函数的正确理解(const和var一样,都是传地址,所以Move是传地址,而恰恰不是传值)太精彩了 good
我们能看到以下代码var pSource,pDest:PChar; len: integer;.......................//一些代码Move(pSource,pDest,l ...
随机推荐
- RadioButton的图标改变大小(TextView也适用)
RadioButton的图标大小并没有相应的布局参数,本文通过自定义属性的方式自定义RadioButton,实现控制图片大小. 本文要点: 自定义属性的使用. 解决RadioButton文字上.下.左 ...
- 写一个vue组件
写一个vue组件 我下面写的是以.vue结尾的单文件组件的写法,是基于webpack构建的项目.如果还不知道怎么用webpack构建一个vue的工程的,可以移步到vue-cli. 一个完整的vue组件 ...
- SpringCloud的服务注册中心(四)- 高可用服务注册中心的搭建
一.双 服务注册注册中心 1.服务注册中心的服务端 - EurekaServer 1.1.EurekaServer1 String.application.name=eureka-server ser ...
- Python入门之ATM+购物车代码版思维导图
该项目结合了ATM模版和购物车需求,整个思维导图用Python代码实现,使用思维导图可以清晰明了的看清整个框架: 过程中,用到了Python的知识有Python常用模块,Python常用内置包,log ...
- linux下Tab及shell 补全python
Python自动补全 Python自动补全有vim编辑下和python交互模式下,下面分别介绍如何在这2种情况下实现Tab键自动补全. vim python自动补全插件:pydiction 可以实现下 ...
- anaconda的使用
1. 查看已安装的库 pip list conda list 其中,pip list 只能查看库,而 conda list 则可以查看库以及库的版本 2. 安装或更新库 pip install scr ...
- Scale
Scale刻度组件. 当你希望用户输入某个范围内的一个数值,使用scale组件可以很好的代替Entry组件. 用法: 创建一个指定范围的Scale组件其实非常容易,你只需要指定from和to两个选项即 ...
- create-keyframe-animation-js实现css3动画
使用JavaScript在浏览器中动态生成CSS关键帧动画. enter(el, done) { // 设置动画帧数 let animation = { 0: { transform: `transl ...
- ABP公共结构
1.ABP依赖注入 维基百科说:“依赖注入是一种软件设计模式,指一个或多个依赖(或服务)被注入,或通过引用传递,传入一个依赖对象(或客户端)并成为客户状态的一部分.模式通过自身的行为分离了客户依赖的创 ...
- 前端之旅HTML与CSS篇之自己总结的关于居中的方法
1.text-align:center :在父容器里水平居中 inline 文字,或 inline 元素 2.line-height 与 height 相等时,垂直居中文字(文字垂直水平居中,同时 ...