📄 武汉宽网博客-[转载] 教你理解复杂的c-c++声明.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<!-- saved from url=(0052)http://www.mpegnet.cn/whwnblog/ShowLog.Asp?LogID=124 -->
<HTML lang=gb2312 xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>武汉宽网博客-[转载] 教你理解复杂的C/C++声明</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META http-equiv=Content-Language content=gb2312>
<META content="MSHTML 6.00.2800.1106" name=GENERATOR>
<META content=武汉宽网,武汉宽网博客,武汉宽网软件,多媒体,多媒体产品 name=keywords>
<META content=武汉宽网博客 name=description><!--Css部分--><LINK
href="武汉宽网博客-[转载] 教你理解复杂的C-C++声明.files/MainStyle.css" type=text/css
rel=stylesheet><LINK href="武汉宽网博客-[转载] 教你理解复杂的C-C++声明.files/DiyStyle.css"
type=text/css rel=stylesheet>
<SCRIPT language=javascript src="武汉宽网博客-[转载] 教你理解复杂的C-C++声明.files/Sys_Ajax.js"
type=text/javascript></SCRIPT>
<SCRIPT language=javascript src="武汉宽网博客-[转载] 教你理解复杂的C-C++声明.files/Sys_Fun.js"
type=text/javascript></SCRIPT>
<SCRIPT language=javascript src="武汉宽网博客-[转载] 教你理解复杂的C-C++声明.files/Sys_Diy.js"
type=text/javascript></SCRIPT>
</HEAD>
<BODY>
<TABLE class=Header cellSpacing=0 cellPadding=0 align=center border=0>
<TBODY>
<TR>
<TD width=550 height=215>
<DIV id=Banner>
<H1><A title=武汉宽网博客
href="http://www.mpegnet.cn/whwnblog/">武汉宽网博客</A></H1><BR><FONT
color=#00660 size=3>
<H2></H2></FONT></DIV></TD>
<TD vAlign=top width=*>
<TABLE cellSpacing=0 cellPadding=0 width="90%" align=center border=0>
<TBODY>
<TR>
<TD height=20> </TD></TR>
<TR>
<TD align=middle></TD></TR>
<TR>
<TD height=3></TD></TR>
<TR>
<TD align=middle></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE class=Main cellSpacing=0 cellPadding=0 align=center border=0>
<TBODY>
<TR>
<TD class=ShowTopMenu><A title=返回首页 href="http://www.mpegnet.cn/whwnblog/"
target=_self>博客首页</A>.<A title=友情链接
href="http://www.mpegnet.cn/whwnblog/FriendSites/Index.Asp"
target=_blank>友情链接</A>.<A title=日志标签
href="http://www.mpegnet.cn/whwnblog/ShowTags.Asp"
target=_blank>日志标签</A>.<A title=留言本
href="http://www.mpegnet.cn/whwnblog/GuestBook/Index.Asp"
target=_blank>留言本</A>.<A title=武汉宽网首页 href="http://www.mpegnet.cn/"
target=_blank>武汉宽网首页</A>.<A title="" href="http://www.mpeg1.cn/"
target=_blank>宽网多媒体技术</A>.<A title=""
href="http://www.mpegnet.cn/dbindex.asp" target=_blank>武汉宽网留言板</A>.<A
title="" href="http://bbs.mpegnet.cn/" target=_blank>宽网多媒体论坛</A></TD></TR>
<TR>
<TD>
<SCRIPT type=text/javascript><!--
google_ad_client = "pub-8522403218414262";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
google_ad_channel = "";
//-->
</SCRIPT>
<SCRIPT src="武汉宽网博客-[转载] 教你理解复杂的C-C++声明.files/show_ads.js"
type=text/javascript>
</SCRIPT>
</TD></TR></TBODY></TABLE><!--日志浏览部分-->
<TABLE class=Main style="PADDING-TOP: 10px" cellSpacing=0 cellPadding=0
align=center border=0>
<TBODY>
<TR>
<TD class=LeftBody vAlign=top width=550>
<SCRIPT type=text/javascript>ShowCountShowLog("124")</SCRIPT>
<TABLE class=ShowItem cellSpacing=0 cellPadding=0 width="96%" align=center
border=0>
<TBODY>
<TR>
<TD class=LogTitle>[转载] 教你理解复杂的C/C++声明</TD></TR>
<TR>
<TD class=LogShowInfo>发表于:2007-7-2 12:01:57 <SPAN
class=LogListSpace>|</SPAN>分类:<A
href="http://www.mpegnet.cn/whwnblog/ShowClass.Asp?ClassID=1">多媒体技术</A>
<SPAN class=LogListSpace>|</SPAN>浏览(<SPAN id=LogHitNum124></SPAN>)
<SPAN class=LogListSpace>|</SPAN>评论(<SPAN
id=LogCommentNum124></SPAN>) <SPAN
class=LogListSpace>|</SPAN>引用(<SPAN id=LogTBNum124></SPAN>) <SPAN
class=LogListSpace>|</SPAN>天气:<IMG title=晴天
src="武汉宽网博客-[转载] 教你理解复杂的C-C++声明.files/Sun_Small.gif" align=absMiddle
border=0></TD></TR>
<TR>
<TD class=ShowContent>
<UL>
<LI class=ShowLogContent>介绍 <BR><BR>曾经碰到过让你迷惑不解、类似于int * (* (*fp1)
(int) )
[10];这样的变量声明吗?本文将由易到难,一步一步教会你如何理解这种复杂的C/C++声明:我们将从每天都能碰到的较简单的声明入手,然后逐步加入
const修饰符和typedef,还有函数指针,最后介绍一个能够让你准确地理解任何C/C++声明的“右左法则”。需要强调一下的是,复杂的C/C+
+声明并不是好的编程风格;我这里仅仅是教你如何去理解这些声明。注意:为了保证能够在同一行上显示代码和相关注释,本文最好在至少1024x768分辨
率的显示器上阅读。 <BR><BR><BR><BR>基础 <BR><BR>让我们从一个非常简单的例子开始,如下:
<BR><BR>int n; <BR><BR>这个应该被理解为“declare n as an int”(n是一个int型的变量)。
<BR><BR>接下去来看一下指针变量,如下: <BR><BR>int *p; <BR><BR>这 个应该被理解为“declare
p as an int *”(p是一个int
*型的变量),或者说p是一个指向一个int型变量的指针。我想在这里展开讨论一下:我觉得在声明一个指针(或引用)类型的变量时,最好将*(或
&)写在紧靠变量之前,而不是紧跟基本类型之后。这样可以避免一些理解上的误区,比如:
<BR><BR>int* p,q;
<BR><BR>第一眼看去,好像是p和q都是int*类型的,但事实上,只有p是一个指针,而q是一个最简单的int型变量。
<BR><BR>我们还是继续我们前面的话题,再来看一个指针的指针的例子: <BR><BR>char **argv;
<BR><BR>理论上,对于指针的级数没有限制,你可以定义一个浮点类型变量的指针的指针的指针的指针...
<BR><BR>再来看如下的声明: <BR><BR>int RollNum[30][4]; <BR>int
(*p)[4]=RollNum; <BR>int *q[5];
<BR><BR>这里,p被声明为一个指向一个4元素(int类型)数组的指针,而q被声明为一个包含5个元素(int类型的指针)的数组。
<BR><BR>另外,我们还可以在同一个声明中混合实用*和&,如下: <BR><BR>int **p1; // p1 is
a pointer to a pointer to an int. <BR>int
*&p2; // p2 is a reference to a pointer to an int.
<BR>int &*p3; // ERROR: Pointer to a reference is
illegal. <BR>int &&p4; // ERROR: Reference to a reference
is illegal.
<BR><BR>注:p1是一个int类型的指针的指针;p2是一个int类型的指针的引用;p3是一个int类型引用的指针(不合法!);p4是一个int类型引用的引用(不合法!)。
<BR><BR><BR><BR>const修饰符
<BR><BR>当你想阻止一个变量被改变,可能会用到const关键字。在你给一个变量加上const修饰符的同时,通常需要对它进行初始化,因为以后的任何时候你将没有机会再去改变它。例如:
<BR><BR>const int n=5; <BR>int const m=10;
<BR><BR>上述两个变量n和m其实是同一种类型的--都是const
int(整形恒量)。因为C++标准规定,const关键字放在类型或变量名之前等价的。我个人更喜欢第一种声明方式,因为它更突出了const修饰符的作用。
<BR><BR>当const与指针一起使用时,容易让人感到迷惑。例如,我们来看一下下面的p和q的声明: <BR><BR>const
int *p; <BR>int const *q; <BR><BR>他们当中哪一个代表const
int类型的指针(const直接修饰int),哪一个代表int类型的const指针(const直接修饰指针)?实际上,p和q都被声明为const
int类型的指针。而int类型的const指针应该这样声明: <BR><BR>int * const r= &n; // n
has been declared as an int <BR><BR>这里,p和q都是指向const
int类型的指针,也就是说,你在以后的程序里不能改变*p的值。而r是一个const指针,它在声明的时候被初始化指向变量n(即r=&n;)之后,r的值将不再允许被改变(但*r的值可以改变)。
<BR><BR>组合上述两种const修饰的情况,我们来声明一个指向const int类型的const指针,如下:
<BR><BR>const int * const p=&n // n has been declared as const
int
<BR><BR>下面给出的一些关于const的声明,将帮助你彻底理清const的用法。不过请注意,下面的一些声明是不能被编译通过的,因为他们需要在声明的同时进行初始化。为了简洁起见,我忽略了初始化部分;因为加入初始化代码的话,下面每个声明都将增加两行代码。
<BR><BR>char **
p1; // pointer
to pointer to char
<BR>const char
**p2; // pointer
to pointer to const char <BR>char * const *
p3; // pointer
to const pointer to char <BR>const char *
const *
p4; // pointer to
const pointer to const char <BR>char ** const
p5; // const pointer
to pointer to char
<BR>const char ** const p6; // const
pointer to pointer to const char <BR>char *
const * const p7; // const pointer to const
pointer to char <BR>const char * const *
const p8; // const pointer to const pointer to const char
<BR><BR>注: p1是指向char类型的指针的指针;p2是指向const
char类型的指针的指针;p3是指向char类型的const指针;p4是指向const
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -