首先先说一下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的一些用法和理解的更多相关文章

  1. HAVING COUNT(*) > 1的用法和理解

    HAVING COUNT(*) > 1的用法和理解 作用是保留包含多行的组. SELECT class.STUDENT_CODE FROM crm_class_schedule class GR ...

  2. 【转】关于 Goroutine Channel Select 的用法和理解

    原文:https://blog.csdn.net/jfkidear/article/details/88661693 ----------------------------------------- ...

  3. RESTful转载,多看几遍就理解了写点自己的看法和理解

    要理解资源路由就要理解什么是RESTful.如果一个架构符合REST(即Representational State Transfer的缩写,意为表现层状态转化)原则,就称它为RESTful架构. R ...

  4. @Configuration和@Bean的用法和理解

    spring Boot提倡约定优于配置,如何将类的生命周期交给spring 1.第一种自己写的类,Controller,Service. 用@controller @service即可 2.第二种,集 ...

  5. 关于微信小程序的一些看法和理解

    最近做了几个小时的调研,微信小程序 微信小程序是可以理解成在微信中的APP,他的目标是APP的替代者,由于目前的APP主要区分安卓和IOS,或者其他平台, 那么微信小程序的平台在微信,在任何一个手机系 ...

  6. oc const 关键字 对指针的理解

    /* int const *p; *p是常量, p是变量 const int *p; *p是常量, p是变量 int * const p; *p是变量, p是常量 const int * const ...

  7. Python中__init__的用法和理解

    在Python中定义类经常会用到__init__函数(方法),首先需要理解的是,两个下划线开头的函数是声明该属性为私有,不能在类的外部被使用或访问.而__init__函数(方法)支持带参数类的初始化, ...

  8. 【转】repo 的一些用法和理解-不错

    原文网址:http://blog.csdn.net/yasin_lee/article/details/5975068 repo的用法(zz) 注:repo只是google用Python脚本写的调用g ...

  9. delphi中move函数的正确理解(const和var一样,都是传地址,所以Move是传地址,而恰恰不是传值)太精彩了 good

    我们能看到以下代码var pSource,pDest:PChar;     len: integer;.......................//一些代码Move(pSource,pDest,l ...

随机推荐

  1. React 深入系列1:React 中的元素、组件、实例和节点

    文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助大家加深对React的理解,以及在项目中 ...

  2. js 获取 最近七天 30天 昨天的方法 -- 转

    自己用到了 找了下  先附上原作的链接  http://www.cnblogs.com/songdongdong/p/7251254.html 原谅我窃取你的果实  谢谢你谢谢你 ~ 先附上我自己用到 ...

  3. 12-TypeScript总结

    从前面的文章大家可以看出,TypeScript具有先天的优势,建议前端开发人员使用TypeScript进行开发,提升自己的面向对象开发思想与能力.: 1.微软开源的客户端脚本语言,是JavaScrip ...

  4. JAVA_SE基础——7.常量&变量

    上一篇,我讲了标识符&关键字    这篇我来解释下变量&常量~~~ 变量与常量这两个概念相信大家都不会感到陌生,在数学中就已经涉及了变量与常量.理解变量与常量,可以举这样一个例子: 例 ...

  5. LeetCode题型分类及索引

    目录 这是一个对LeetCode题目归类的索引,分类标准参考了July大神的<编程之法>以及LeetCode的tag项.分类可能还不太合理,逐步完善,请见谅~ 题主本人也在一点一点的刷题, ...

  6. JAVA 中的 反射

    CLASS类 1) 在面向对象的世界里,万事万物皆对象. 在java中有两样东西不是面向对象 1.普通的数据类型(java中有封装类来弥补它) 2. java中静态的东西 2) 类是对象吗? 类是对象 ...

  7. 在WebStorm中启动Angular项目

    点击配置 创建 选择命令 package.json 运行 查看运行结果

  8. kubernetes入门(07)kubernetes的核心概念(4)

    一.pod 二.Volume volume可以为容器提供持久化存储,比如 三.私有镜像 在使用私有镜像时,需要创建一个docker registry secret,并在容器中引用.创建docker r ...

  9. 关于css的层叠上下文和层叠顺序问题

    关于css的层叠上下文和层叠样式问题 最近在项目中遇到了一个让我欲仙欲死的问题,我给项目中的图片设置了一个淡入效果,几opacity变化,但当我在它的上面有一个定位元素时,动画结束后,定位元素居然被遮 ...

  10. 19届华为实习生笔试之判断iPv6地址类型

    题二: 答案: #coding=utf-8 import re,sys str = sys.stdin.readline().strip() def regex(str): result = &quo ...