C语言关键字const用法

C语言关键字const用法

导语:C是高级语言,它把高级语言的基本结构和语句与低级语言的实用性结合起来。下面就由为大家介绍一下C语言关键字const用法,欢迎大家阅读!

c语言中的const">C语言中的const

const是C语言中保留的一个关键字,用来定义常量,如果一个变量被const修饰,那么它的值就不能被改变。使用符号常量写出的代码更容易维护;一些指针常常是边读边移动,而不是边写边移动;许多编程规范对于函数参数会强制要求只读不写,在这些情况下,都需要借助const实现。

那么有些人会问,C语言中不是已经存在#define了吗,为什么还要使用const呢?相比于#define,const修饰符有如下优势:

1、 const能够使编译器进行类型检查,而预编译指令#define只是简单的对值进行替换。

2、 const可以保护被修饰的变量等,防止变量因为意外被修改,从而增强程序的健壮性。

3、 编译器通常不为普通const常量分配存储空间,而是将他们保存在符号表中,这使得它成为了一个编译期间的常量,没有了存储于内存操作,使得它的效率很高。

const用法

const最常见的用法就是作为数组的边界和switch分情况标号,分类如下:

常变量: const + 类型说明符 + 变量名

常引用: const + 类型说明符 + &引用名

常对象: 类名 + const 对象名

常成员函数: 类名::fun(形参) + const

常数组: 类型说明符 + const 数组名[大小]

常量指针: const + 类型说明符* 指针名 或者 类型说明符 + const *指针名

首先提示的是:在常变量(const + 类型说明符 + 变量名)、常引用(const + 类型说明符 + &引用名)、常对象(类名 + const 对象名)、 常数组(类型说明符 + const 数组名[大小]), const”与“类型说明符”或“类名”(其实类名是一种自定义的类型说明符) 的位置可以互换。如:

12 const int a=5; int const a=5; //等同

其实这种可以很好理解,const只能修饰int(类型名或类名),所以二者是等同的。

  修饰局部变量

12 const int n=5; int const n=5;

这两种写法是一样的,都是表示变量n的值不能被改变了,需要注意的是,用const修饰变量时,一定要给变量初始化(用来修饰函数的形参除外),否则之后就不能再进行赋值了。C语言中,const定义的常量是全局的,C++中则是视声明位置而定。

接下来看看const用于修饰常量静态字符串,例如:

1 const char* str = "fdsafdsa";

如果没有const的修饰,我们可能会在后面有意无意的写str[4]=’x’这样的语句,这样会导致对只读内存区域的赋值,然后程序会立刻异常终止。有了const,这个错误就能在程序被编译的时候就立即检查出来,这就是const的好处。让逻辑错误在编译期被发现。

  常量指针与指针常量

常量指针

常量指针表示一个指向常量的指针,即该指针指向的内容是个常量(至少该常量指针是这样认为的),可以有如下的定义方式:

12 const int * n; int const * n;

  需要注意以下两点:

1。常量指针指向的值是不能改变的,但是这不意味指针本身不能改变,常量指针是可以指向其他的地址的。

12345 int a=5; int b=6; const int* n = &a; int const *n1 = &a; n=&b;

这个例子中,n和n1是等价的,都是指向a的一个常量指针,这时候有人会说,常量指针指向的应该是一个常量吧,但是a并不是一个常量啊,为什么常量指针依旧可以指向a呢,这时候又要注意一下了:

编译器允许把非 const 对象的地址赋给指向 const 对象的指针,不允许把一个 const 对象的地址赋给一个普通的、非 const 对象的指针。

其实这个也很好理解,对于一个变量,我可以对你增加束缚,用指向const对象的指针指向你,这只是意味着我现在认为你是常量,不能通过这个常量指针对你进行修改,但是对于第二种情况就不一样了,你本来是一个被束缚的常量,如果用一个普通的指针指向你的话,就意味着我认为你这个常量是一个变量,这样或许我会在下面的代码中,对你的值进行修改,对一个const常量进行修改,会发生什么,你应该明白。

然后回到上面的代码,我们将a的地址给了n,然后在下一行又改变了n的值,将b的.地址赋给了n,这是没有任何问题的,因为n只是一个指针,指向了一个常量,所以被称为常量指针,它本身依旧是一个普通的指针,比较特殊的是它所指向的内容,而不是它本身。所以它本身的值可以修改,指向不同的内容。

2。当常量指针指向了一个变量时,不能通过这个常量指针改变变量的值,但是还是可以通过其他的引用来改变变量的值的。

123456 int a=5; const int* n=&a; a=6; // 正确 *n = 7; //错误,对于常量指针,不能通过该指针来改变所指向的内容(即使它所指向的内容并不是一个常量)。 int *ni = (int *)n; *n = 100; //正确

在n这个指针眼中,n所指向的内容是一个常量,所以不允许别人通过n本身对a进行修改,但是a本质上是一个变量,所以我们可以直接通过变量名或者新的普通指针对a进行修改。实际上,在将程序载入内存的时候,会有专门的一块内存区域来存放常量。但是,上面的a本身不是常量,是存放在栈或者堆中的。我们仍然可以修改它的值。而n不能修改指向的值应该说是编译器的一个限制。

指针常量

指针常量是指指针本身是一个常量,它只能指向一个固定的地址,不能指向别的地址。写法如下:

1 int *const n;

和上面的常量指针不一样,指针常量是指指针本身比较特殊,而它所指的内容并不特殊,因此,指针常量指向的内容是可以修改的,可以通过别的指向该地址的指针进行修改。如下所示:

1234 int a=5; int *p=&a; int* const n=&a; *p=8;

在函数中,指针常量时表示不允许将该指针指向其他内容:

1234567891011121314 void func_02(int* const p) { int *pi = new int(100); /* 错误!P是指针常量。不能对它赋值。 */ p = pi; } int main() { int* p = new int(10); func_02(p); p; return 0; }

然后看下面的代码:

12 const int *m1 = new int(10); int* const m2 = new int(20);

在上面的两个表达式中,最容易让人迷惑的是const到底是修饰指针还是指针指向的内存区域?其实,只要知道:const只对它左边的东西起作用,唯一的例外就是const本身就是最左边的修饰符,那么它才会对右边的东西起作用。根据这个规则来判断,m1应该是常量指针(即不能通过m1来修改它所指向的内容。);而m2应该是指针常量(即不能让m2指向其他的内存地址)。或者我们可以把星号看做指针,把const看做常量,那么m1就是常量指针,m2就是指针常量。

指向常量的常指针

是以上两种的结合,指针指向的位置不能改变并且也不能通过这个指针改变变量的值,但是当它指向一个变量时,依然可以通过其他的普通指针改变变量的值。

const int* const p;

修饰函数的参数

根据常量指针与指针常量,const修饰函数的参数也是分为三种情况

1。防止修改指针指向的内容

1 void StringCopy(char *strDestination, const char *strSource);

其中 strSource 是输入参数,strDestination 是输出参数。给 strSource 加上 const 修饰后,如果函数体内的语句试***改动 strSource 的内容,编译器将指出错误。这种形式通常用于在数组形式的参数中模拟传值调用。也就是相当于函数调用者声称:”我给你一个指向它的指针,但你不能去修改它。”如果函数编写者遵循了这个约定,那么就相当于模拟了值传递。这也是const最有用之处了:用来限定函数的形参,这样该函数将不会修改实参指针所指的数据。这里注意了,是函数不应该去修改而不是不能修改,也就是说const不能阻止参数的修改(原因见上)。

2。防止修改指针指向的地址

1 void swap (int* const p1 , int* const p2);

指针p1和指针p2都是指针常量,指向的地址都不能修改。

修饰函数的返回值

很多时候,我们的函数中会返回一个地址或者引用。调用这得到这个返回的地址或者引用后就可以修改所指向或者代表的对象。这个时候如果我们不希望这个函数的调用这修改这个返回的内容,就应该返回一个常量。

如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。

例如函数

1 const char * GetString(void);

如下语句将出现编译错误:

1 char *str = GetString();

正确的用法是

1 const char *str = GetString();

修饰全局变量

全局变量的作用域是整个文件,我们应该尽量避免使用全局变量,以为一旦有一个函数改变了全局变量的值,它也会影响到其他引用这个变量的函数,导致除了bug后很难发现,如果一定要用全局变量,我们应该尽量的使用const修饰符进行修饰,这样方式不必要的以为修改,使用的方法与局部变量是相同的。

const 在c和c++中的区别

C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中。所以,以下代码:

using namespace std;

int main()

{

const int a = 1;

const int b = 2;

int array[ a + b ] = {0};

for (int i = 0; i < sizeof array / sizeof *array; i++)

{

cout << array << endl;

}

}

在可以通过编译,并且正常运行。但稍加修改后,放在C编译器中,便会出现错误:

int main()

{

int i;

const int a = 1;

const int b = 2;

int array[ a + b ] = {0};

for (i = 0; i < sizeof array / sizeof *array; i++)

{

printf(“%d”,array);

}

}

错误消息:

c: est1 e。c(8): error C2057: 应输入常数表达式

c: est1 e。c(8): error C2466: 不能分配常数大小为 0 的数组

出现这种情况的原因是:在C中,const是一个不能被改变的普通变量,既然是变量,就要占用存储空间,所以编译器不知道编译时的值。而且,数组定义时的下标必须为常量。 在C语言中: const int size; 这个语句是正确的,因为它被C编译器看作一个声明,指明在别的地方分配存储空间。但在C++中这样写是不正确的。C++中const默认是内部连接,如果想在C++中达到以上的效果,必须要用extern关键字。即C++中,const默认使用内部连接。而C中使用外部连接。

(1) 内连接:编译器只对正被编译的文件创建存储空间,别的文件可以使用相同的表示符或全局变量。C/C++中内连接使用static关键字指定。

(2) 外连接:所有被编译过的文件创建一片单独存储空间。一旦空间被创建,连接器必须解决对这片存储空间的引用。全局变量和函数使用外部连接。通过extern关键字声明,可以从其他文件访问相应的变量和函数。

C语言关键字const用法

转载请注明出处我优求知网 » C语言关键字const用法

学习

千克与克说课稿(精选)

阅读(52)

本文为您介绍千克与克说课稿(精选),内容包括北师大三年级下册千克和克说课稿,千克与克的说课稿冀教版。作为一名默默奉献的教育工作者,很有必要精心设计一份说课稿,借助说课稿可以有效提升自己的教学能力。那么你有了解过说课稿吗?以下是整理

学习

绿植放在客厅什么位置风水好

阅读(53)

本文为您介绍绿植放在客厅什么位置风水好,内容包括绿植放在客厅哪个位置好,客厅种什么绿植风水好。绿植放在客厅什么位置风水好,众所周知室内的风水,有很多的讲究,那么大家知道绿植放在客厅什么位置风水好吗,下面就来看一看绿植放在客厅什么

学习

住房公积金可以买车吗

阅读(51)

本文为您介绍住房公积金可以买车吗,内容包括住房公积金可以买车吗深圳,住房公积金可以买车吗乌鲁木齐。住房公积金是我国五险一金中的一金,因为其可以进行大笔款项的贷款,所以很多人都在问住房公积金可以买车吗。关于这个问题的回答,已经整

学习

保护绿植作文

阅读(72)

本文为您介绍保护绿植作文,内容包括我的绿植朋友三年级作文,保护绿植的优秀作文。在平时的学习、工作或生活中,大家都接触过作文吧,借助作文可以宣泄心中的情感,调节自己的心情。相信很多朋友都对写作文感到非常苦恼吧,以下是精心整理的保护

学习

越南春节的由来

阅读(43)

本文为您介绍越南春节的由来,内容包括越南春节起源官方纪录,越南春节歌曲。文字像精灵,只要你用好它,它就会产生让你意想不到的效果。所以无论我们说话还是作文,都要运用好文字。只要你能准确灵活的用好它,它就会让你的语言焕发出活力和光彩

学习

《黔之驴》教案

阅读(185)

作为一名默默奉献的教育工作者,总归要编写教案,教案是备课向课堂教学转化的关节点。那么什么样的教案才是好的呢?以下是为大家整理的《黔之驴》教案,希望对大家有所帮助。

学习

幕后英雄作文

阅读(87)

本文为您介绍幕后英雄作文,内容包括幕后英雄作文800字,幕后英雄作文素材。在学习、工作、生活中,大家总少不了接触作文吧,作文是从内部言语向外部言语的过渡,即从经过压缩的简要的、自己能明白的语言,向开展的、具有规范语法结构的、能为他

学习

C语言的32个关键字

阅读(43)

本文为您介绍C语言的32个关键字,内容包括c语言的32个关键字什么意思,c语言的32个关键字怎么读。C语言的关键字共有32个,可分其为数据类型关键字、控制语句关键字、存储类型关键字以及其它关键字,下面是相关的知识,欢迎阅读。

学习

老人与海故事梗

阅读(51)

本文为您介绍老人与海故事梗,内容包括老人与海主要内容前十篇30个字,老人与海故事梗概与读后感。导语:《老人与海》讲的是一个“硬汉”以坚强的意志与凶恶的敌手进行一场孤独的抗争。下面是为您整理的故事梗概,欢迎阅读。

学习

逢入京使 拼音

阅读(44)

本文为您介绍逢入京使 拼音,内容包括逢入京使拼音版,逢入京使拼音版完整版。诗写游客邂逅京使,托他捎带口信回家的情境。诗来自生活,反映生活,信手写去,不事雕琢,亲切不味,真挚感人。以下是为大家整理的逢入京使拼音,仅供参考,欢迎大家阅读。

学习

传组词有哪些

阅读(128)

本文为您介绍传组词有哪些,内容包括传组词有哪些词语,传组词有哪些二年级。文字像精灵,只要你用好它,它就会产生让你意想不到的效果。所以无论我们说话还是作文,都要运用好文字。只要你能准确灵活的用好它,它就会让你的语言焕发出活力和光彩

学习

雨后出太阳的句子

阅读(102)

本文为您介绍雨后出太阳的句子,内容包括雨后见太阳的唯美句子,雨后太阳出来的句子。无论是在学校还是在社会中,大家都看到过许多经典的句子吧,句子是语言运用的基本单位,它由词、词组(短语)构成。什么样的句子才经典呢?下面是精心整理的雨后

学习

哇好香作文(精选)

阅读(42)

本文为您介绍哇好香作文(精选),内容包括哇牛粪好香作文600字,哇真香作文700字初中。在日常学习、工作和生活中,大家都接触过作文吧,作文可分为小学作文、中学作文、大学作文(论文)。那么你有了解过作文吗?以下是精心整理的哇好香作文,仅供参考,大

学习

大班美术刮画教案

阅读(39)

本文为您介绍大班美术刮画教案,内容包括幼儿园大班美术刮画教案,刮画的美术教案。一、大班教案的特点

学习

姜的用法和禁忌

阅读(48)

本文为您介绍姜的用法和禁忌,内容包括姜的正确食用方法和禁忌,姜有九种用法。姜的吃法很多,例如喝姜汤,吃姜粥,炒菜热油时放点姜丝,炖肉、煎鱼加姜片,制扁食、水饺馅时加点姜末,既能使味道鲜美,又有助于醒胃开脾,提神,促进食欲,帮助消化和有助胃肠

学习

for的用法

阅读(79)

本文为您介绍for的用法,内容包括for的用法归纳总结,for的用法小技巧大全。大家应该都是认识for吧,for是作为一个常见的英语介词,用法很多,了解它的用法,可以为自己学习英语提供了很多方便。下面是给大家带来的for的用法,以供大家参考,我们一起

学习

护发素的用法

阅读(44)

本文为您介绍护发素的用法,内容包括护发素的用法教程,护发素过期了怎么变废为宝。很多人都用过护发素,但是对于护发素的使用方法却不甚了解,那么,怎样才能正确的使用护发素呢?我们这个给大家介绍一下正确使用护发素的一些小常识,相信看了之

学习

定语从句what的用法

阅读(79)

本文为您介绍定语从句what的用法,内容包括定语从句what,定语从句引导词what的用法。定语从句中能不能用what?如果可以,那么大家知道怎么用?下面是为大家整理的定语从句what的用法,希望能够帮助到大家。

学习

播音主持语言的特点

阅读(48)

本文为您介绍播音主持语言的特点,内容包括播音主持语言的特点有哪些,播音主持语言特点鼓动性的素材。作为表情达意、言志传神的有声语言,具有思维、交际和传播的工具性,同时又是文化的载体。它必然负载着人们的思想感情,体现出认识客观世界

学习

C语言的关键字和控制语句有哪些

阅读(71)

本文为您介绍C语言的关键字和控制语句有哪些,内容包括c语言中控制语句关键字,c语言的主要关键字有哪些。C语言的关键字共有32个,根据关键字的作用,可分其为数据类型关键字、控制语句关键字、存储类型关键字和其它关键字四类。下面是相关的

学习

网络语言对汉语言文化影响浅析论文

阅读(105)

本文为您介绍网络语言对汉语言文化影响浅析论文,内容包括网络语言对汉语言文学的影响论文,浅析网络语言对汉语言发展的影响。无论是在学校还是在社会中,大家或多或少都会接触过论文吧,论文是讨论某种问题或研究某种问题的文章。你知道论文

学习

C语言和C++的区别

阅读(60)

本文为您介绍C语言和C++的区别,内容包括c语言和c的区别是什么,c++和c语言的区别。C和C++之间有什么关系?C和C++的关系就像是win98跟winXP的关系。C++是在C的基础上增加了新的理论,玩出了新的花样。所以叫C加加。