C语言之const修饰符

原创 2015年11月18日 16:36:01

一、什么是const

const是C语言中一种只读取变量但是不能修改其值的一种修饰符。

二、const的作用

1、const可定义一个常量,一旦定义便不能改变。

2、对数据方便修改,即改变定义的值后,程序中的所有与之相关的值都会改变。

4、可以保护被修饰的东西,防止意外的修改。

5、可以节约空间,因为编译器不会为其分配空间而是保存在符号表中.

6、、const用于限定函数的返回值
const int foo();
const struct mytype foo(); 
上述写法限定函数的返回值不可被更新,当函数返回内部的类型时,已经是一个数值,当然不可被赋值更新,所以,此时const无意义,最好去掉,以免困惑。当函数返回自定义的类型时,这个类型仍然包含可以被赋值的变量成员,所以,此时有意义

7、const用于函数的地址传递参数
void foo(const int *p);
这种形式通常用于在数组形式的参数中模拟传值调用。也就是相当于函数调用者声称:"我给你一个指向它的指针,但你不能去修改它。"如果函数编写者遵循了这个约定,那么就相当于模拟了值传递。这也是const最有用之处了:用来限定函数的形参,这样该函数将不会修改实参指针所指的数据。这里注意了,是函数不应该去修改而不是不能修改,也就是说const不能阻止参数的修改(原因见上)。

1、const的普通用法
const int n = 10;
意思很明显,n是一个只读变量,程序不可以直接修改其值。这里还有一个问题需要注意,即如下使用:int a[n];在ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而n只是一个变量。

2、const用于指针
const int *p;
int const *p;
int * const p;
在最后的一种情况下,指针是只读的(即p只读),而在另外两种情况下,指针所指向的对象是只读的(即*p只读)。const 是一个左结合的类型修饰符,它与其左侧的类型修饰符一起为一个类型修饰符,所以,int const 限定 *p,不限定p。int *const 限定p,不限定*p。

这里有一个简便的区分方法:沿着*号划一条线,如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。

3、const用于函数的地址传递参数
void foo(const int *p);
这种形式通常用于在数组形式的参数中模拟传值调用。也就是相当于函数调用者声称:"我给你一个指向它的指针,但你不能去修改它。"如果函数编写者遵循了这个约定,那么就相当于模拟了值传递。这也是const最有用之处了:用来限定函数的形参,这样该函数将不会修改实参指针所指的数据。这里注意了,是函数不应该去修改而不是不能修改,也就是说const不能阻止参数的修改(原因见上)。

4、const用于限定函数的返回值
const int foo();
const struct mytype foo(); 
上述写法限定函数的返回值不可被更新,当函数返回内部的类型时,已经是一个数值,当然不可被赋值更新,所以,此时const无意义,最好去掉,以免困惑。当函数返回自定义的类型时,这个类型仍然包含可以被赋值的变量成员,所以,此时有意义。 

三、怎样用const

一般的将const用在类型说明符之前,若要定义一个数组有两种形式

int const a[i]={\\\\\}
const int a[i]={\\\\\}; 这两种意义是一样的.
若是定义一个指针const·的位置不同意义就不同,如下:

const int *A; //const修饰指向的对象,A可变,A指向的对象不可变 
int const *A; //const修饰指向的对象,A可变,A指向的对象不可变 
int *const A; //const修饰指针A, A不可变,A指向的对象可变 
const int *const A;//指针A和A指向的对象都不可变 

C语言之const修饰符

const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,即就是说其所修饰的对象为常量。当你代码中想要设法阻止一个变量被改变,那么这个时候可以选择使用const关键字。在你给一个变量加上con...
  • lenchio
  • lenchio
  • 2014年03月05日 22:32
  • 711

C语言的那些小秘密之const修饰符

或许还有不少人对于const修饰符理解的并不深刻,都只是停留在一个比较浅的层面上,仅仅是在读别人代码的时候看到了const修饰符的使用,自己的写代码的过中从未使用过,所以自然对于const修饰符比较陌...
  • bigloomy
  • bigloomy
  • 2011年07月09日 22:13
  • 12944

C语言---从指针到二重指针(上)

江湖传言:得指针者得C语言。不知道这句话是从什么时候开始流传的,不过这也不重要,重要的是我们隐约能从中感受到指针在C语言中的重要性。对于初学C语言的人来说,指针可能是大多数人心中的痛。笔者当年学C语言...
  • flysall_all
  • flysall_all
  • 2017年03月18日 09:48
  • 250

(译)追本溯源 —— C之精神

声明:本文原刊于程序员杂志第10期,略有删节,非经杂志社和作者书面许可,不得转载。原文作者:Greg Colvin http://www.artima.com/cppsource/spiritofc....
  • SeSe
  • SeSe
  • 2004年11月10日 14:44
  • 3048

C语言之基本算法32—鞍点

//数组 /* ================================================================== 题目:求任意矩阵的所有鞍点!并统计个数!(在...
  • LZX19901012
  • LZX19901012
  • 2015年07月13日 00:59
  • 1521

c语言之内存使用

要写一篇关于c内存文章 发现前辈已经写的很完善,直接转载过来 c 内存分配 1、程序代码区:存放函数体的二进制代码。   2、全局区数据区:全局数据区划分为三个区域。...
  • u010785958
  • u010785958
  • 2015年01月06日 18:56
  • 253

"C语言之美" -- 变量名

C语言是一种优美的语言。如果你不能体会到这种语言的魅力,那么你将无法真正爱上这门语言。 C语言是一种面向过程的语言,这也就决定它的优点和不可避免的缺点。在嵌入式领域中,是把C语言作为开发语言。这是为什...
  • zhengqijun_
  • zhengqijun_
  • 2016年08月11日 15:53
  • 315

c语言坦克大战源码分析

/* Note:Your choice is C IDE */ #include "graphics.h" #include "stdlib.h" #include "stdio.h" #de...
  • yaowei701424
  • yaowei701424
  • 2011年08月03日 00:06
  • 1472

C语言之比较法

           C语言之比较法                                                                         ...
  • qq_32046111
  • qq_32046111
  • 2016年01月26日 12:22
  • 463

仿基因编程的C++源码

#ifndef __GWL_H__#define __GWL_H__//GWL名字空间的开始#define GWL_BEGIN namespace gwl{//GWL名字空间的结束#define GW...
  • guanwl
  • guanwl
  • 2007年02月26日 11:00
  • 4729
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言之const修饰符
举报原因:
原因补充:

(最多只允许输入30个字)