C语言const关键字的用法

2023-09-06 0 1,056

学控制技术,布季日拱一卒、长年累月的累积。

那时一起来预测C词汇,constURL的用语。

C语言const关键字的用法

const的用语

const是两个C词汇(ANSI C)的32个URL众所周知,较为常采用。

它限量发行两个表达式,其值不容许被改变,造成动态促进作用。

采用const在很大某种程度上能提升流程的可靠性和可靠性。

const在其他编程词汇中也有再次出现,比如Pascal、C++、PHP5、B#.net、HC08 C、C#等。

const 面世的如上所述目地,便是为的是替代预校对命令,消解它的缺点,与此同时承继它的缺点。

用语:

1、能表述两个表达式为const类别,则表示该表达式的值无法被发生改变。

例:

const int a=100;

a=120; //会造成严重错误

2、易于展开类别检查和,使C++对处置文本有更多介绍,消解了许多安全隐患。

例:

/*C++就会晓得i是两个表达式,但值不容许被修正*/

void f(const int i)

{

/* code */

}

3、能避免意义模糊的数字再次出现,同样能很方便地展开参数的调整和修正。同宏表述一样,能做到不变则已,一变都变!

4、能保护被修饰的东西,防止意外的修正,增强流程的健壮性。还是上面的例子,如果在函数体内修正了i,编译器就会报错;

例:

void f(const int i)

{

i=8;//严重错误

}

5、能节省空间,避免不必要的内存分配。

例:

#define PAI 3.14159 //常量宏

const double Pai=3.14159; //此时并未将Pi放入ROM中 ……

double i=Pai; //此时为Pi分配内存,以后不再分配!

double l=PAI; //校对期间展开宏替换,分配内存

double j=Pai; //没有内存分配

double J=PAI; //再展开宏替换,又一次分配内存!

const表述常量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,const表述的常量在流程运行过程中只有一份拷贝,而#define表述的常量在内存中有若干份拷贝。

6、提升了效率

C++通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为两个校对期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

C语言const关键字的用法

const应用案例

案例1:

const int n = 5;

int a[n];//严重错误

答案与预测:

1、为啥int a[n];语句严重错误了呢?这个问题讨论的是“常量”与“只读表达式”的区别。

常量,比如5, “abc”,等,肯定是只读的,因为常量是被C++放在内存中的只读区域,当然也就无法够去修正它。

而“只读表达式”则是在内存中开辟两个地方来存放它的值,只不过这个值由C++限量发行不容许被修正。

C词汇URLconst就是用来限量发行两个表达式不容许被发生改变的修饰符。

上述代码中表达式n被修饰为只读表达式,可惜再怎么修饰也不是常量。而ANSI C规定数组定义时长度必须是“常量”(C99标准,数组下标能用表达式来则表示),“只读表达式”也是无法的,“常量”不等于“不可变的表达式”。但是在C++中,局部数组是能采用表达式作为其长度的。但是在标准C++中,这样定义的是两个常量,这种写法是对的。实际上,根据校对过程及内存分配来看,这种用语本来就应该是合理的,只是ANSI C对数组的规定限制了它(实际上用GCC或VS2005校对以上代码,确实没有严重错误造成,也没有给出警告)。那么,在ANSI C中用什么来表述常量呢?答案是enum类别和#define宏,这两个都能用来表述常量。

2、下面分别用const限量发行不可变的文本是什么?

2.1、const在前面

const int a=2;//a的值无法被发生改变

const char *sp; //指针sp可变,但指针sp指向地址里面的类别无法被发生改变。

char * const sp; //指针sp无法被发生改变,但sp指针指向地址里面的数能被发生改变

const char * const sp; //指针sp无法被发生改变,指针指向地址里面的数也无法被发生改变。

2.2、const在后面,与上面的声明对等

int const a; //a的值无法被发生改变

char const * sp; //指针sp可变,但指针指向地址里面的数无法被发生改变

char * const sp; //sp指针无法发生改变,但指针指向地址里面的数可变。

char const* const pContent; //指针sp无法被发生改变,指针指向地址里面的数也无法被发生改变。

const和指针一起采用是C词汇中两个很常见的困惑之处,在实际开发中,特别是在看别人代码的时候,常常会因为这样而不好判断作者的意图,下面讲一下我的判断原则:

const只修饰其后的表达式,至于const放在类别前还是类别后并没有区别。如:const int a和int const a都是修饰a为const。注意*不是一种类别,如果*sp之前是某类别,那么sp是指向该类别的指针。两个简单的判断方法:指针运算符*,是从右到左,那么如:char const * sp,能理解为char const (* sp),即* sp为const,而sp则是可变的。

案例2:

int const * p1,p2;

p2是const;(*p1)是一整体,因此(*p1)是const,但p1是可变的。int * p1,p2只代表p1是指向整型的指针,要则表示p1、p2都是指针是需写成int * p1,* p2。所以无论是* const p1,p2还是const * p1,p2,里面的*都是属于p1的。

案例3:

int const * const p1,p2;

p2是const,是前两个const修饰的,*p1也被前两个const修饰,而p1被后两个const修饰。所以p1指针无法被发生改变,p1指针指向地址里面的数也无法被发生改变。

案例4:

int * const p1,p2;

p1指针是const,无法被修正,但p1指针指向地址里面的数可变,p2表达式值也可被发生改变。

指针指向及其指向表达式的值的变化:

const在*的左边,则指针指向的表达式的值不可直接通过指针发生改变(能通过其他途径发生改变);在*的右边,则指针的指向不可变。简记为“左定值,右定指向”。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务