首先先说一下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. python端口扫描用多线程+线程安全的队列+Thread类实现

    用线程安全的队列Queue实现扫描端口数据存储 用多线程扫描端口 用Thread类实现程序组织 #coding:utf-8 import sys import socket import sys im ...

  2. LeetCode & Q189-Rotate Array-Easy

    Array Description: Rotate an array of n elements to the right by k steps. For example, with n = 7 an ...

  3. PHP处理上传文件

    HTML中使用type = 'file'类型的表单可以向服务器上传文件: 上传文件的表单必须在form中定义enctyp = 'multipart/form-data': HTML代码如下: < ...

  4. 求解数独难题, Sudoku问题(回溯)

    Introduction : 标准的数独游戏是在一个 9 X 9 的棋盘上填写 1 – 9 这 9 个数字,规则是这样的: 棋盘分成上图所示的 9 个区域(不同颜色做背景标出,每个区域是 3 X 3 ...

  5. PHP常见排序算法

    $a = [1, 3, 5, 2, 4, 6, 12, 60, 45, 10, 32];$len = count($a);$num=0;/* * 冒泡排序 * 原理:不停的对相邻两个数进行比较,直到最 ...

  6. Linux下的Shell编程(2)环境变量和局部变量

    Shell Script是一种弱类型语言,使用变量的时候无需首先声明其类型. 局部变量在本地数据区分配内存进行存储,这个变量归当前的Shell所有,任何子进 程都不能访问本地变量.这些变量与环境变量不 ...

  7. H5的canvas绘图技术

    canvas元素是HTML5中新添加的一个元素,该元素是HTML5中的一个亮点.Canvas元素就像一块画布,通过该元素自带的API结合JavaScript代码可以绘制各种图形和图像以及动画效果. 1 ...

  8. Python基础--函数的定义和调用

    一.函数的作用: 提高代码的可读性,减少代码的冗余,方便调用和修改,组织结构清晰 二.函数的定义:函数遵循先定义后调用的原则 1.无参函数 def funcname(): #def 是关键字,后跟函数 ...

  9. 项目管理器 ProjectManager Beta 10 发布

    本次更新内容: 可以设置主界面是否显示表格线 去除了开发日志界面的表格线,看起来好像好看一些 修复主界面时间显示的问题 自定义问候语 修复习惯统计记录时间显示错误的问题 修复创建项目时间错误问题 增加 ...

  10. Web开发笔记

    jquery ui draggable clone之后不会克隆draggable功能,要重新设置