<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[const的使用！]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Thu, 04 Dec 2008 07:40:20 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	C中CONST的使用：<br/>const是一个C语言的关键字，它限定一个变量不允许被改变。使用const在一定程度上可以提<br/>高程序的健壮性，另外，在观看别人代码的时候，清晰理解const所起的作用，对理解对方的<br/>程序也有一些帮助。<br/>　　虽然这听起来很简单，但实际上，const的使用也是c语言中一个比较微妙的地方，微妙在<br/>何处呢？请看下面几个问题。<br/>　　<br/>　　　　问题：const变量 &amp; 常量<br/>　　<br/>　　　　为什么我象下面的例子一样用一个const变量来初始化数组，ANSI C的编译器会报告<br/>一个错误呢？<br/>　　<br/>　　<br/>　　<br/>　　const int n = 5;<br/>　　int a[n];<br/>　　<br/>　　<br/>　　<br/>　　　　答案与分析:<br/>　　<br/>　　　　1）、这个问题讨论的是“常量”与“只读变量”的区别。常量肯定是只读的，例如<br/>5， “abc”，等，肯定是只读的，因为程序中根本没有地方存放它的值，当然也就不能够去<br/>修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值，只不过这个值由编译器限<br/>定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符<br/>（Qualifier）。上述代码中变量n被修饰为只读变量，可惜再怎么修饰也不是常量。<br/>而ANSI C规定数组定义时维度必须是“常量”，“只读变量”也是不可以的。<br/>　　<br/>　　　　2)、注意：在ANSI C中，这种写法是错误的，因为数组的大小应该是个常量，而<br/>const int n,n只是一个变量（常量 != 不可变的变量，但在标准C++中，这样定义的是一个<br/>常量，这种写法是对的），实际上，根据编译过程及内存分配来看，这种用法本来就应该是合<br/>理的，只是 ANSI C对数组的规定限制了它。<br/>　　<br/>　　　　3)、那么，在ANSI C 语言中用什么来定义常量呢？答案是enum类型和#define宏，<br/>这两个都可以用来定义常量。<br/>　　<br/>　　<br/>　　问题：const变量 &amp; const 限定的内容<br/>　　<br/>　　　　下面的代码编译器会报一个错误，请问，哪一个语句是错误的呢？<br/>　　<br/>　　<br/>　　<br/>　　typedef char * pStr;<br/>　　char string[4] = &quot;abc&quot;;<br/>　　const char *p1 = string;<br/>　　const pStr p2 = string;<br/>　　p1++;<br/>　　p2++;<br/>　　<br/>　　　　答案与分析：<br/>　　<br/>　　　　问题出在p2++上。<br/>　　<br/>　　　　1)、const使用的基本形式： const char m;<br/>　　<br/>　　　　限定m不可变。<br/>　　<br/>　　　　2)、替换1式中的m, const char *pm;<br/>　　<br/>　　　　限定*pm不可变，当然pm是可变的，因此问题中p1++是对的。<br/>　　<br/>　　　　3)、替换1式char, const newType m;<br/>　　<br/>　　　　限定m不可变，问题中的charptr就是一种新类型，因此问题中p2不可变，p2++是错误的。<br/>　　<br/>　　　　问题：const变量 &amp; 字符串常量<br/>　　<br/>　　　　请问下面的代码有什么问题？<br/>　　<br/>　　char *p = &quot;i&#039;m hungry!&quot;;<br/>　　p[0]= &#039;I&#039;;<br/>　　<br/>　　　　答案与分析：<br/>　　<br/>　　　　上面的代码可能会造成内存的非法写操作。分析如下， “i&#039;m hungry”实质上是字<br/>符串常量，而常量往往被编译器放在只读的内存区，不可写。p初始指向这个只读的内存区，而<br/>p[0] = &#039;I&#039;则企图去写这个地方，编译器当然不会答应。<br/>　　<br/>　　　　问题：const变量 &amp; 字符串常量2<br/>　　<br/>　　　　请问char a[3] = &quot;abc&quot; 合法吗？使用它有什么隐患？<br/>　　<br/>　　　　答案与分析：<br/>　　<br/>　　　　在标准C中这是合法的，但是它的生存环境非常狭小；它定义一个大小为3的数组，初<br/>始化为“abc”，，注意，它没有通常的字符串终止符&#039;&#92;0&#039;，因此这个数组只是看起来像C语言<br/>中的字符串，实质上却不是，因此所有对字符串进行处理的函数，比如strcpy、printf等，<br/>都不能够被使用在这个假字符串上。<br/>　　<br/>　　　　问题5：const &amp; 指针<br/>　　<br/>　　　　类型声明中const用来修饰一个常量，有如下两种写法，那么，请问，下面分别用<br/>const限定不可变的内容是什么?<br/>　　<br/>　　　　1)、const在前面<br/>　　<br/>　　const int nValue； //nValue是const<br/>　　const char *pContent; //*pContent是const, pContent可变<br/>　　const (char *) pContent;//pContent是const,*pContent可变<br/>　　char* const pContent; //pContent是const,*pContent可变<br/>　　const char* const pContent; //pContent和*pContent都是const<br/>　　<br/>　　　　2)、const在后面，与上面的声明对等<br/>　　<br/>　　int const nValue； // nValue是const<br/>　　char const * pContent;// *pContent是const, pContent可变<br/>　　(char *) const pContent;//pContent是const,*pContent可变<br/>　　char* const pContent;// pContent是const,*pContent可变<br/>　　char const* const pContent;// pContent和*pContent都是const<br/>　　<br/>　　<br/>　　　　答案与分析：<br/>　　<br/>　　　　const和指针一起使用是C语言中一个很常见的困惑之处，在实际开发中，特别是在看<br/>别人代码的时候，常常会因为这样而不好判断作者的意图，下面讲一下我的判断原则：<br/>　　<br/>　　　　沿着*号划一条线，如果const位于*的左侧，则const就是用来修饰指针所指向的变<br/>量，即指针指向为常量；如果const位于*的右侧，const就是修饰指针本身，即指针本身是常<br/>量。你可以根据这个规则来看上面声明的实际意义，相信定会一目了然。<br/>　　<br/>　　　　另外，需要注意：对于const (char *) ; 因为char *是一个整体，相当于一个类<br/>型(如 char)，因此，这是限定指针是const。
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] const的使用！]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>