⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 武汉宽网博客-[转载] 教你理解复杂的c-c++声明.htm

📁 最全的介绍C语言结构体的使用方法和使用技巧!
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<!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>&nbsp;</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型变量的指针。我想在这里展开讨论一下:我觉得在声明一个指针(或引用)类型的变量时,最好将*(或 
              &amp;)写在紧靠变量之前,而不是紧跟基本类型之后。这样可以避免一些理解上的误区,比如: 
              <BR><BR>int*&nbsp;&nbsp;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>另外,我们还可以在同一个声明中混合实用*和&amp;,如下: <BR><BR>int **p1; // p1 is 
              a pointer&nbsp;&nbsp;to a pointer&nbsp;&nbsp;to an int. <BR>int 
              *&amp;p2; // p2 is a reference to a pointer&nbsp;&nbsp;to an int. 
              <BR>int &amp;*p3; // ERROR: Pointer&nbsp;&nbsp;to a reference is 
              illegal. <BR>int &amp;&amp;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= &amp;n; // n 
              has been declared as an int <BR><BR>这里,p和q都是指向const 
              int类型的指针,也就是说,你在以后的程序里不能改变*p的值。而r是一个const指针,它在声明的时候被初始化指向变量n(即r=&amp;n;)之后,r的值将不再允许被改变(但*r的值可以改变)。 
              <BR><BR>组合上述两种const修饰的情况,我们来声明一个指向const int类型的const指针,如下: 
              <BR><BR>const int * const p=&amp;n // n has been declared as const 
              int 
              <BR><BR>下面给出的一些关于const的声明,将帮助你彻底理清const的用法。不过请注意,下面的一些声明是不能被编译通过的,因为他们需要在声明的同时进行初始化。为了简洁起见,我忽略了初始化部分;因为加入初始化代码的话,下面每个声明都将增加两行代码。 
              <BR><BR>char ** 
              p1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;pointer 
              to&nbsp;&nbsp;&nbsp;&nbsp;pointer to&nbsp;&nbsp;&nbsp;&nbsp;char 
              <BR>const char 
              **p2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;pointer 
              to&nbsp;&nbsp;&nbsp;&nbsp;pointer to const char <BR>char * const * 
              p3;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;pointer 
              to const pointer to&nbsp;&nbsp;&nbsp;&nbsp;char <BR>const char * 
              const * 
              p4;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;pointer to 
              const pointer to const char <BR>char ** const 
              p5;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// const pointer 
              to&nbsp;&nbsp;&nbsp;&nbsp;pointer to&nbsp;&nbsp;&nbsp;&nbsp;char 
              <BR>const char ** const p6;&nbsp;&nbsp;&nbsp;&nbsp;// const 
              pointer to&nbsp;&nbsp;&nbsp;&nbsp;pointer to const char <BR>char * 
              const * const p7;&nbsp;&nbsp;&nbsp;&nbsp;// const pointer to const 
              pointer to&nbsp;&nbsp;&nbsp;&nbsp;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 + -