﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-北国飘雨-文章分类-C/C++基础知识</title><link>http://www.cppblog.com/chad/category/10808.html</link><description>思念的季节</description><language>zh-cn</language><lastBuildDate>Wed, 10 Jun 2009 14:25:38 GMT</lastBuildDate><pubDate>Wed, 10 Jun 2009 14:25:38 GMT</pubDate><ttl>60</ttl><item><title>结构体总结</title><link>http://www.cppblog.com/chad/articles/87008.html</link><dc:creator>北国飘雨</dc:creator><author>北国飘雨</author><pubDate>Sun, 07 Jun 2009 11:18:00 GMT</pubDate><guid>http://www.cppblog.com/chad/articles/87008.html</guid><wfw:comment>http://www.cppblog.com/chad/comments/87008.html</wfw:comment><comments>http://www.cppblog.com/chad/articles/87008.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chad/comments/commentRss/87008.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chad/services/trackbacks/87008.html</trackback:ping><description><![CDATA[<p><font color=#0968f7 size=3><strong>一.结构体用法总结</strong></font><br></p>
<p>1. 结构就是多个变量的集合：&nbsp; <br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Code_Closed_Image_190217 onclick="this.style.display='none'; Code_Closed_Text_190217.style.display='none'; Code_Open_Image_190217.style.display='inline'; Code_Open_Text_190217.style.display='inline';" height=16 src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><img id=Code_Open_Image_190217 style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_190217.style.display='none'; Code_Closed_Image_190217.style.display='inline'; Code_Closed_Text_190217.style.display='inline';" height=16 src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><span id=Code_Closed_Text_190217 style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">代码示例</span><span id=Code_Open_Text_190217 style="DISPLAY: none"><br><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;Rec<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;y;<br>};<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;Rec&nbsp;r1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;r1.x</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">111</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;r1.y</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">222</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d,&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,r1.x,r1.y);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></span></div>
<p><br></p>
<p>2. 定义时同时声明变量：　　</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Code_Closed_Image_190345 onclick="this.style.display='none'; Code_Closed_Text_190345.style.display='none'; Code_Open_Image_190345.style.display='inline'; Code_Open_Text_190345.style.display='inline';" height=16 src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><img id=Code_Open_Image_190345 style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_190345.style.display='none'; Code_Closed_Image_190345.style.display='inline'; Code_Closed_Text_190345.style.display='inline';" height=16 src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><span id=Code_Closed_Text_190345 style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">代码示例</span><span id=Code_Open_Text_190345 style="DISPLAY: none"><br><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;Rec<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;y;<br>}r1,r2;<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)<br>{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;r1.x</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">111</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;r1.y</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">222</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;r2.x</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">333</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;r2.y</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">444</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d,&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,r1.x,r1.y);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d,&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,r2.x,r2.y);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></span></div>
<p><br>3. 定义时同时声明变量并赋值：&nbsp;</p>
<p>&#160;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Code_Closed_Image_190557 onclick="this.style.display='none'; Code_Closed_Text_190557.style.display='none'; Code_Open_Image_190557.style.display='inline'; Code_Open_Text_190557.style.display='inline';" height=16 src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><img id=Code_Open_Image_190557 style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_190557.style.display='none'; Code_Closed_Image_190557.style.display='inline'; Code_Closed_Text_190557.style.display='inline';" height=16 src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><span id=Code_Closed_Text_190557 style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">代码示例1</span><span id=Code_Open_Text_190557 style="DISPLAY: none"><br><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;Rec<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;y;<br>}r1</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">{</span><span style="COLOR: #000000">111</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">222</span><span style="COLOR: #000000">};<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)<br>{&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d,&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,r1.x,r1.y);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></span></div>
<p><br>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Code_Closed_Image_190720 onclick="this.style.display='none'; Code_Closed_Text_190720.style.display='none'; Code_Open_Image_190720.style.display='inline'; Code_Open_Text_190720.style.display='inline';" height=16 src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><img id=Code_Open_Image_190720 style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_190720.style.display='none'; Code_Closed_Image_190720.style.display='inline'; Code_Closed_Text_190720.style.display='inline';" height=16 src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><span id=Code_Closed_Text_190720 style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">代码实例2</span><span id=Code_Open_Text_190720 style="DISPLAY: none"><br><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;Rec<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;name[</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">];<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">&nbsp;age;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>}r1</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Chad</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">};<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)<br>{&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s,&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,r1.name,r1.age);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></span></div>
<p>&nbsp;4. 声明变量是赋初值：<br>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Code_Closed_Image_190854 onclick="this.style.display='none'; Code_Closed_Text_190854.style.display='none'; Code_Open_Image_190854.style.display='inline'; Code_Open_Text_190854.style.display='inline';" height=16 src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><img id=Code_Open_Image_190854 style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_190854.style.display='none'; Code_Closed_Image_190854.style.display='inline'; Code_Closed_Text_190854.style.display='inline';" height=16 src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><span id=Code_Closed_Text_190854 style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">代码示例</span><span id=Code_Open_Text_190854 style="DISPLAY: none"><br><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;Rec<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;name[</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">];<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">&nbsp;age;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>};<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)<br>{&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">struct&nbsp;Rec&nbsp;r1={"Chad",20};</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Rec&nbsp;r1</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Chad</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">};<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s,&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,r1.name,r1.age);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></span></div>
<p>　<br>6. 如果在定义时直接声明变量， 可省略结构名：&nbsp; 　</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_47_79_Open_Image onclick="this.style.display='none'; Codehighlighter1_47_79_Open_Text.style.display='none'; Codehighlighter1_47_79_Closed_Image.style.display='inline'; Codehighlighter1_47_79_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_47_79_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_47_79_Closed_Text.style.display='none'; Codehighlighter1_47_79_Open_Image.style.display='inline'; Codehighlighter1_47_79_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_47_79_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_47_79_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;name[</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">&nbsp;age;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_83_93_Open_Image onclick="this.style.display='none'; Codehighlighter1_83_93_Open_Text.style.display='none'; Codehighlighter1_83_93_Closed_Image.style.display='inline'; Codehighlighter1_83_93_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_83_93_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_83_93_Closed_Text.style.display='none'; Codehighlighter1_83_93_Open_Image.style.display='inline'; Codehighlighter1_83_93_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>}</span></span><span style="COLOR: #000000">r1</span><span style="COLOR: #000000">=</span><span id=Codehighlighter1_83_93_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_83_93_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Chad</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_111_162_Open_Image onclick="this.style.display='none'; Codehighlighter1_111_162_Open_Text.style.display='none'; Codehighlighter1_111_162_Closed_Image.style.display='inline'; Codehighlighter1_111_162_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_111_162_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_111_162_Closed_Text.style.display='none'; Codehighlighter1_111_162_Open_Image.style.display='inline'; Codehighlighter1_111_162_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_111_162_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_111_162_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s,&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,r1.name,r1.age);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
&nbsp;7. 通过 scanf 赋值：&nbsp; 　
<p><strong><font color=#0033ff size=4>二.struct 和 typedef struct的区别</font></strong><br></p>
<p>struct&nbsp; _x1 { ...}x1; 和 typedef&nbsp; struct&nbsp; _x2{ ...} x2; 有什么不同？&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>其实, <span style="COLOR: red">前者是定义了类_x1和_x1的对象实例x1,&nbsp; 后者是定义了类_x2和_x2的类别名x2</span> ,&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>所以它们在使用过程中是有取别的.请看实例.&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;[知识点]&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>结构也是一种数据类型, 可以使用结构变量, 因此,&nbsp; 象其它 类型的变量一样, 在使用结构变量时要先对其定义。&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 定义结构变量的一般格式为:&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; struct 结构名&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型&nbsp; 变量名;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型&nbsp; 变量名;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; } 结构变量;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 结构名是结构的标识符不是变量名。<br>另一种常用格式为:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;typedef struct 结构名&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型&nbsp; 变量名;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型&nbsp; 变量名;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; } 结构别名;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>另外注意:&nbsp; 在C中，struct不能包含函数。在C++中，对struct进行了扩展，可以包含函数。&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;<br>======================================================================&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;<br>实例1:&nbsp; struct.cpp&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>#include <iostream>&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>using namespace std;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>typedef struct _point{&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int y;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }point; //定义类，给类一个别名&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>struct _hello{&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x,y;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } hello; //同时定义类和对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>int main()&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; point pt1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; pt1.x = 2;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; pt1.y = 5;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; cout&lt;&lt; "ptpt1.x=" &lt;&lt; pt1.x &lt;&lt; "pt.y=" &lt;
<pt1.y <<endl;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;//hello pt2;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //pt2.x = 8;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //pt2.y =10;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //cout&lt;&lt;"pt2pt2.x="&lt;&lt; pt2.x &lt;&lt;"pt2.y="&lt;
<pt2.y <<endl;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //上面的hello pt2;这一行编译将不能通过. 为什么?&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //因为hello是被定义了的对象实例了.&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //正确做法如下: 用hello.x和hello.y&nbsp;&nbsp;&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp; hello.x = 8;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; hello.y = 10;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; cout&lt;&lt; "hellohello.x=" &lt;&lt; hello.x &lt;&lt; "hello.y=" &lt;<hello.y <<endl;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; return 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>}&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;<br>typedef struct与struct的区别&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>1. 基本解释&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>typedef为C语言的关键字，作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型（int,char等）和自定义的数据类型（struct等）。&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;<br>在编程中使用typedef目的一般有两个，一个是给变量一个易记且意义明确的新名字，另一个是简化一些比较复杂的类型声明。&nbsp;&nbsp;&nbsp;&nbsp;<br><br>至于typedef有什么微妙之处，请你接着看下面对几个问题的具体阐述。<br>2. typedef &amp; 结构的问题&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp; <br>当用下面的代码定义一个结构时，编译器报了一个错误，为什么呢？莫非C语言不允许在结构中包含指向它自己的指针吗？请你先猜想一下，然后看下文说明：&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>typedef struct tagNode&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>{&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　char *pItem;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　pNode pNext;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>} *pNode;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>答案与分析：&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>1、typedef的最简单使用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; typedef long byte_4;&nbsp;&nbsp;&nbsp;//知数据类型long起个新名字，叫byte_4。&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>2、 typedef与结构结合使用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>typedef struct tagMyStruct&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>{&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　int iNum;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　long lLength;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>} MyStruct;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这语句实际上完成两个操作：&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;<br>　　1) 定义一个新的结构类型&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>struct tagMyStruct&nbsp;&nbsp;&nbsp;&nbsp;<br>{&nbsp;&nbsp;&nbsp;&nbsp;<br>　int iNum;&nbsp;&nbsp;&nbsp;&nbsp;<br>　long lLength;&nbsp;&nbsp;&nbsp;&nbsp;<br>};&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>　　分析：tagMyStruct称为&#8220;tag&#8221;，即&#8220;标签&#8221;，实际上是一个临时名字，struct 关键字和tagMyStruct一起，构成了这个结构类型，不论是否有typedef，这个结构都存在。&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>　　<span style="COLOR: red">我们可以用struct tagMyStruct varName来定义变量，但要注意，使用tagMyStruct varName来定义变量是不对的，因为struct 和tagMyStruct合在一起才能表示一个结构类型。(本人认为：这句话是不正确的，实际程序师可以不加struct的)</span><br><br>typedef为这个新的结构起了一个名字，叫MyStruct。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>typedef struct tagMyStruct MyStruct;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>　　因此，MyStruct实际上相当于struct tagMyStruct，我们可以使用MyStruct varName来定义变量。&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>　　答案与分析&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>　　C语言当然允许在结构中包含指向它自己的指针，我们可以在建立链表等数据结构的实现上看到无数这样的例子，上述代码的根本问题在于typedef的应用。&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>　　根据我们上面的阐述可以知道：新结构建立的过程中遇到了pNext域的声明，类型是pNode，要知道pNode表示的是类型的新名字，那么在类型本身还没有建立完成的时候，这个类型的新名字也还不存在，也就是说这个时候编译器根本不认识pNode。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>　　解决这个问题的方法有多种：&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>1)、&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;<br>typedef struct tagNode&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>{&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　char *pItem;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　struct tagNode *pNext;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>} *pNode;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>2)、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>typedef struct tagNode *pNode;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>struct tagNode&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>{&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　char *pItem;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　pNode pNext;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>注意：在这个例子中，你用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>3)、规范做法：&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;<br>struct tagNode&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>{&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　char *pItem;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　struct tagNode *pNext;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>};&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>typedef struct tagNode *pNode;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>C++中typedef关键字的用法&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>Typedef 声明有助于创建平台无关类型，甚至能隐藏复杂和难以理解的语法。不管怎样，使用 typedef 能为代码带来意想不到的好处，通过本文你可以学习用 typedef 避免缺欠，从而使代码更健壮。&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef 声明，简称 typedef，为现有类型创建一个新的名字。比如人们常常使用 typedef 来编写更美观和可读的代码。所谓美观，意指 typedef 能隐藏笨拙的语法构造以及平台相关的数据类型，从而增强可移植性和以及未来的可维护性。本文下面将竭尽全力来揭示 typedef 强大功能以及如何避免一些常见的陷阱。&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如何创建平台无关的数据类型，隐藏笨拙且难以理解的语法?&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; 使用 typedefs 为现有类型创建同义字。定义易于记忆的类型名&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　typedef 使用最多的地方是创建易于记忆的类型名，用它来归档程序员的意图。类型出现在所声明的变量名字中，位于 ''typedef'' 关键字右边。例如：typedef int size;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　此声明定义了一个 int 的同义字，名字为 size。注意 typedef 并不创建新的类型。它仅仅为现有类型添加一个同义字。你可以在任何需要 int 的上下文中使用 size：void measure(size * psz);&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>size array[4];&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>size len = file.getlength();&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>std::vector <size>vs;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　typedef 还可以掩饰符合类型，如指针和数组。例如，你不用象下面这样重复定义有 81 个字符元素的数组：char line[81];&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>char text[81];&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>定义一个 typedef，每当要用到相同类型和大小的数组时，可以这样：typedef char Line[81];&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>Line text, secondline;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>getline(text);&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>同样，可以象下面这样隐藏指针语法：typedef char * pstr;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>int mystrcmp(pstr, pstr);&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　这里将带我们到达第一个 typedef 陷阱。标准函数 strcmp()有两个&#8216;const char *'类型的参数。因此，它可能会误导人们象下面这样声明 mystrcmp()：int mystrcmp(const pstr, const pstr);&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　这是错误的，按照顺序，&#8216;const pstr'被解释为&#8216;char * const'（一个指向 char 的常量指针），而不是&#8216;const char *'（指向常量 char 的指针）。这个问题很容易解决：typedef const char * cpstr;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>int mystrcmp(cpstr, cpstr); // 现在是正确的&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>记住：不管什么时候，只要为指针声明 typedef，那么都要在最终的 typedef 名称中加一个 const，以使得该指针本身是常量，而不是对象。代码简化&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　上面讨论的 typedef 行为有点像 #define 宏，用其实际类型替代同义字。不同点是 typedef 在编译时被解释，因此让编译器来应付超越预处理器能力的文本替换。例如：typedef int (*PF) (const char *, const char *);&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　这个声明引入了 PF 类型作为函数指针的同义字，该函数有两个 const char * 类型的参数以及一个 int 类型的返回值。如果要使用下列形式的函数声明，那么上述这个 typedef 是不可或缺的：PF Register(PF pf);&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　Register() 的参数是一个 PF 类型的回调函数，返回某个函数的地址，其署名与先前注册的名字相同。做一次深呼吸。下面我展示一下如果不用 typedef，我们是如何实现这个声明的：int (*Register (int (*pf)(const char *, const char *)))&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>(const char *, const char *);&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　很少有程序员理解它是什么意思，更不用说这种费解的代码所带来的出错风险了。显然，这里使用 typedef 不是一种特权，而是一种必需。持怀疑态度的人可能会问："OK，有人还会写这样的代码吗？"，快速浏览一下揭示 signal()函数的头文件 <csinal>，一个有同样接口的函数。typedef 和存储类关键字（storage class specifier）&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　这种说法是不是有点令人惊讶，typedef 就像 auto，extern，mutable，static，和 register 一样，是一个存储类关键字。这并是说 typedef 会真正影响对象的存储特性；它只是说在语句构成上，typedef 声明看起来象 static，extern 等类型的变量声明。下面将带到第二个陷阱：typedef register int FAST_COUNTER; // 错误&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　编译通不过。问题出在你不能在声明中有多个存储类关键字。因为符号 typedef 已经占据了存储类关键字的位置，在 typedef 声明中不能用 register（或任何其它存储类关键字）。促进跨平台开发&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　typedef 有另外一个重要的用途，那就是定义机器无关的类型，例如，你可以定义一个叫 REAL 的浮点类型，在目标机器上它可以i获得最高的精度：typedef long double REAL;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>在不支持 long double 的机器上，该 typedef 看起来会是下面这样：typedef double REAL;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>并且，在连 double 都不支持的机器上，该 typedef 看起来会是这样：、typedef float REAL;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　你不用对源代码做任何修改，便可以在每一种平台上编译这个使用 REAL 类型的应用程序。唯一要改的是 typedef 本身。在大多数情况下，甚至这个微小的变动完全都可以通过奇妙的条件编译来自动实现。不是吗? 标准库广泛地使用 typedef 来创建这样的平台无关类型：size_t，ptrdiff 和 fpos_t 就是其中的例子。此外，象 std::string 和 std::ofstream 这样的 typedef 还隐藏了长长的，难以理解的模板特化语法，例如：basic_string<char, char_traits<char>，allocator<char>&gt; 和 basic_ofstream<char, char_traits<char>&gt;。&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; <br>　typedef &amp; #define的问题　　有下面两种定义pStr数据类型的方法，两者有什么不同？哪一种更好一点？typedef char *pStr;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>#define pStr char *;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　答案与分析：&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　通常讲，typedef要比#define要好，特别是在有指针的场合。请看例子：typedef char *pStr1;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>#define pStr2 char *;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>pStr1 s1, s2;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>pStr2 s3, s4;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　在上述的变量定义中，s1、s2、s3都被定义为char *，而s4则定义成了char，不是我们所预期的指针变量，根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。　　#define用法例子：#define f(x) x*x&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>main( )&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>{&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　int a=6，b=2，c；&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　c=f(a) / f(b)；&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　printf("%d <a href="http://blog.tianya.cn/myblog/file%20:////n"><u><font color=#0000ff>\\n</font></u></a>"，c)；&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>}&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　以下程序的输出结果是: 36。&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　因为如此原因，在许多C语言编程规范中提到使用#define定义时，如果定义中包含表达式，必须使用括号，则上述定义应该如下定义才对：#define f(x) (x*x) 　　当然，如果你使用typedef就没有这样的问题。&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　4. typedef &amp; #define的另一例　　下面的代码中编译器会报一个错误，你知道是哪个语句错了吗？&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>typedef char * pStr;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>char string[4] = "abc";&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>const char *p1 = string;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>const pStr p2 = string;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>p1++;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>p2++;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　答案与分析：&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　是p2++出错了。这个问题再一次提醒我们：typedef和#define不同，它不是简单的文本替换。上述代码中const pStr p2并不等于const char * p2。const pStr p2和const long x本质上没有区别，都是对变量进行只读限制，只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而已。因此，const pStr p2的含义是：限定数据类型为char *的变量p2为只读，因此p2++错误。　　#define与typedef引申谈&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　1) #define宏定义有一个特别的长处：可以使用 #ifdef ,#ifndef等来进行逻辑判断，还可以使用#undef来取消定义。&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　2) typedef也有一个特别的长处：它符合范围规则，使用typedef定义的变量类型其作用范围限制在所定义的函数或者文件内（取决于此变量定义的位置），而宏定义则没有这种特性。&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　5. typedef &amp; 复杂的变量声明&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　在编程实践中，尤其是看别人代码的时候，常常会遇到比较复杂的变量声明,使用typedef作简化自有其价值，比如：&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　下面是三个变量的声明，我想使用typdef分别给它们定义一个别名，请问该如何做？&gt;1：int *(*a[5])(int, char*);&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&gt;2：void (*b[10]) (void (*)());&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&gt;3. doube(*)() (*pa)[9];&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>　　答案与分析：　　对复杂变量建立一个类型别名的方法很简单，你只要在传统的变量声明表达式里用类型名替代变量名，然后把关键字typedef加在该语句的开头就行了。&gt;1：int *(*a[5])(int, char*);&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>//pFun是我们建的一个类型别名&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>typedef int *(*pFun)(int, char*);&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>//使用定义的新类型来声明对象，等价于int* (*a[5])(int, char*);&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>pFun a[5];&gt;2：void (*b[10]) (void (*)());&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>//首先为上面表达式蓝色部分声明一个新类型&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>typedef void (*pFunParam)();&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>//整体声明一个新类型&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>typedef void (*pFun)(pFunParam);&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>//使用定义的新类型来声明对象，等价于void (*b[10]) (void (*)());&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>pFun b[10];&gt;3. doube(*)() (*pa)[9];&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>//首先为上面表达式蓝色部分声明一个新类型&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>typedef double(*pFun)();&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>//整体声明一个新类型&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>typedef pFun (*pFunParam)[9];&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>//使用定义的新类型来声明对象，等价于doube(*)() (*pa)[9];&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>pFunParam pa;&nbsp;&nbsp; </p>
<img src ="http://www.cppblog.com/chad/aggbug/87008.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chad/" target="_blank">北国飘雨</a> 2009-06-07 19:18 <a href="http://www.cppblog.com/chad/articles/87008.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++输入输出格式总结</title><link>http://www.cppblog.com/chad/articles/87003.html</link><dc:creator>北国飘雨</dc:creator><author>北国飘雨</author><pubDate>Sun, 07 Jun 2009 10:44:00 GMT</pubDate><guid>http://www.cppblog.com/chad/articles/87003.html</guid><wfw:comment>http://www.cppblog.com/chad/comments/87003.html</wfw:comment><comments>http://www.cppblog.com/chad/articles/87003.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chad/comments/commentRss/87003.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chad/services/trackbacks/87003.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1．cin、cin.get()、cin.getline()　cin: 输入一系列字符，其中自动略过空格、tab、换行符等空白符。遇到文件结束符时返回0，但并不把这个0值放到输入对象中。cin并去除行的结束符，所以在一行的结束直接用cin.get()会读取结束符号。cin.get(): 接收一个输入字符（包括空白符、换行符），返回该字符值，遇到文件结束符时，返回EOF（即这个文件结束符）。...&nbsp;&nbsp;<a href='http://www.cppblog.com/chad/articles/87003.html'>阅读全文</a><img src ="http://www.cppblog.com/chad/aggbug/87003.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chad/" target="_blank">北国飘雨</a> 2009-06-07 18:44 <a href="http://www.cppblog.com/chad/articles/87003.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>