像我儿子一样永远保持好奇和梦想

[b][z]static 用法:

上一篇 / 下一篇  2013-01-10 15:44:00 / 个人分类:c/c++

ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 a#]rx(l



1ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台%_o:gb%B g`2Y

CONST

添加义项这是一个多义词,请在下列义项中选择浏览
  1. 1.C中的CONST
  2. 2.C++中CONST
  3. 3.PHP5中的CONST
  4. 4.C#.net中的const
  5. 5.const在HC08C语言中的含义
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台!h aCAM9HRC

 

-RJ9vk)C#L:Df)~0

1.C中的CONST

编辑本义项

CONST

求助编辑百科名片

const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。另外CONST在其他编程语言中也有出现,如C++、PHP5、C#.net、HC08 C。ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台"V0GR7c|-_ y

目录ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台u%{;N3iY

问题1:const变量&常量
问题2:const限定内容
问题3:const & 指针
展开
问题1:const变量&常量
问题2:const限定内容
问题3:const & 指针
展开

编辑本段问题1:const变量&常量

例:为什么下面的例子在使用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢? 
const int n = 5;
int a[n];
答案与分析:
1)这个问题讨论的是“常量”与“只读变量”的区别。常量,例如5, "abc",等,肯定是只读的,因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。而ANSI C规定数组定义时长度必须是“常量”,“只读变量”也是不可以的,“常量”不等于“不可变的变量”。
2)但是在标准C++中,这样定义的是一个常量,这种写法是对的。实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是ANSI C对数组的规定限制了它(实际上用GCC或VS2005编译以上代码,确实没有错误产生,也没有给出警告)。
3)那么,在ANSI C中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量。

编辑本段问题2:const限定内容

例:下面的代码编译器会报一个错误,请问,哪一个语句是错误的呢? 
typedef char * pStr;
char string[4] = "abc";
const char *p1 = string; //1式
const pStr p2 = string; //2式
p1++;
p2++;
答案与分析:
问题出在p2++上。
1)const使用的基本形式: const type m;
限定m不可变。
2)替换基本形式中的m为1式中的*p1,替换后const char *p1;
限定*p1不可变,当然p1是可变的,因此问题中p1++是对的。
3)替换基本形式中的type为2式中的pStr,替换后const pStr m;
限定m不可变,题中的pStr就是一种新类型,因此问题中p2不可变,p2++是错误的。

编辑本段问题3:const & 指针

例一:

下面分别用const限定不可变的内容是什么?
1)const在前面
const int nValue; //nValue是const
const char *pContent; //*pContent是const, pContent可变
const char* const pContent; //pContent和*pContent都是const
2)const在后面,与上面的声明对等
int const nValue; //nValue是const
char const * pContent; //*pContent是const, pContent可变
char* const pContent; //pContent是const,*pContent可变
char const* const pContent; //pContent和*pContent都是const
答案与分析:
const和指针一起使用是C语言中一个很常见的困惑之处,在实际开发中,特别是在看别人代码的时候,常常会因为这样而不好判断作者的意图,下面讲一下我的判断原则:
const只修饰其后的变量,至于const放在类型前还是类型后并没有区别。如:const int a和int const a都是修饰a为const。*不是一种类型,如果*pType之前是某类型,那么pType是指向该类型的指针
一个简单的判断方法:指针运算符*,是从右到左,那么如:char const * pContent,可以理解为char const (* pContent),即* pContent为const,而pContent则是可变的。[1]

例二:

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的。

例三:

int const * const p1,p2;
p2是const,是前一个const修饰的,*p1也被前一个const修饰,而p1被后一个const修饰。

例四:

int * const p1,p2;
p1是const,(* const p1)是整体,所以const不修饰p2。

例五:

指针指向及其指向变量的值的变化
const在*的左边,则指针指向的变量的值不可变;在*的右边,则指针的指向不可变。简记为“左定值,右定向”。
1)指针指向的变量的值不能变,指向可变
int x = 1;
int y = 2;
const int* px = &x;
int const* px = &x; //这两句表达式一样效果
px = &y; //正确,允许改变指向
*px = 3; //错误,不允许改变指针指向的变量的值
2)指针指向的变量的值可以改变,指向不可变
int x = 1;
int y = 2;
int* const px = &x;
px = &y; //错误,不允许改变指针指向
*px = 3; //正确,允许改变指针指向的变量的值
3)指针指向的变量的值不可变,指向不可变
int x = 1;
int y = 2;
const int* const px = &x;
int const* const px = &x;
px = &y; //错误,不允许改变指针指向
*px = 3; //错误,不允许改变指针指向的变量的值

补充

在c中,对于const定义的指针,不赋初值编译不报错,
即int* const px;等不会报错。
但是,在C++中
int* const px;和const int* const px;会报错,const int* px;不报错。
必须初始化指针的指向int* const px = &x;const int* const px=&x;
强烈建议在初始化时说明指针的指向,防止出现野指针!
参考资料

MQ1Z2o;td/gKS N0 

{G'tF.C `7H0

WDze`0


1ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台R1P"Q8h,y@ w%{0bS

4S%e4aPw1FJ0   C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望朋友们有所帮助。ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台wu f'l4\

Const C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台:QDciY G!X8S%L

 

]!X2e\A&J5\|S \0

一、Const作用ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台z4C L-Ffqe

   如下表所示:ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 H;_V6Yt`}!nZ

No.

_:L!S+p:CdA:b0

作用ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 CD'D3X2cV GJ

说明

'D$]/yHx m/AIc0

参考代码ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台0| l isP@m

1

4U0x8]p-jM9aT3H0

可以定义const常量

`,pf jy }C vG0

 

;dAf2]7SG*Y0

const int Max = 100; ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 D mBQu0k2~

2ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台9BU6F9Qo

便于进行类型检查

)T#|7xR{$b\]0

const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台.c1V6xF/z P| r%[

void f(const int i) { .........}
hP+m3L t-fJ,y(z0      
//对传入的参数进行类型检查,不匹配进行提示

tippZ{0

3ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台Q&x FLs

可以保护被修饰的东西

|hg}'}]"z0

防止意外的修改,增强程序的健壮性。

*e4G l,L } T9[0

void f(const int i) { i=10;//error! }ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台B)q5S8G m
      
//如果在函数体内修改了i,编译器就会报错ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台EG8K6b EW/f*R+s

4ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台;I;M"e9]b&U3V

可以很方便地进行参数的调整和修改ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台}i-S.S6}K7r3H

同宏定义一样,可以做到不变则已,一变都变

#{:z8DA ry t0

 

p~xGT,X jQ0

5

Vp5R}QJ4v(A!m |0

为函数重载提供了一个参考ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台o4B%t-sKq7|I

 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台&Y0xz$E+d#W|!{#J

class AET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台0`}%@0p9y(oM\
{
+sb6@0xg0H%KX%W0           ......ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台0kKxQZRyPY
  void f(int i)       {......} //
一个函数
"dS|2Vjd#`0  void f(int i) const {......} //
上一个函数的重载
*\x{U-P!\?6[0           ......
&I }^;u(|0};
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台K c)qw] ` a

6ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台r!S3Y1zyxN a8j

可以节省空间,避免不必要的内存分配

~*Ks.G(xeY:D0{0

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

7n jQq.\B IC0

#define PI 3.14159         //常量宏
$c}(dI^0const doulbe  Pi=3.14159;  //
此时并未将Pi放入ROM
T&A%A6a2@emy,E0              ......ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台'J(Q6Z%M$C5o9]
double i=Pi;   //
此时为Pi分配内存,以后不再分配!
N6d|!K+`i m+k C0double I=PI;  //
编译期间进行宏替换,分配内存
*rV)V?#}!kj0double j=Pi;  //
没有内存分配
*v!y6B @V3n9G m-D0double J=PI;  //
再进行宏替换,又一次分配内存!ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台,bawb`)IS&m#i

7ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台8dj8v$C3u#@'Ho TZX+v

 提高了效率

l-TKj%Up9{0

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

B2ZH,]rlH8m0

 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 n3IZXt

 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台:Q)@|*_%mu#j%q

+LHPR"\#z(G9Q0

cDl!R^"D0

二、Const的使用ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台a aE:uRO~E#Y

1

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar