﻿<?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/lance123/category/89.html</link><description>有事不慌，无事不荒，有容乃大，无欲则刚，以德立纲，外圆内方。 </description><language>zh-cn</language><lastBuildDate>Fri, 23 May 2008 05:40:28 GMT</lastBuildDate><pubDate>Fri, 23 May 2008 05:40:28 GMT</pubDate><ttl>60</ttl><item><title>C语言结构指针</title><link>http://www.cppblog.com/lance123/articles/707.html</link><dc:creator>无情雨</dc:creator><author>无情雨</author><pubDate>Tue, 18 Oct 2005 16:49:00 GMT</pubDate><guid>http://www.cppblog.com/lance123/articles/707.html</guid><wfw:comment>http://www.cppblog.com/lance123/comments/707.html</wfw:comment><comments>http://www.cppblog.com/lance123/articles/707.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lance123/comments/commentRss/707.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lance123/services/trackbacks/707.html</trackback:ping><description><![CDATA[这篇文章是九九年写的，这篇文章适合中级程序员。有不明白之处不要紧，多看几遍，然后花些时间上机操作及认真思考每个问题。遇到难题要研究、解决，难题出现于哪里？该用什么方式来解决？为什么要选择这个方式解决？有其它的解决方法吗？这样的解决方案完美吗？其实做个程序员这些基本的思考心得是要掌握的。记住；遇问题不要逃避，要面对现实、勇于<SPAN class=v9>挑战，仔细研究难题的所在，这样相信你会成功的！</SPAN>
<P align=left><SPAN class=v9>　　指针结构与指针的关系亦有两重：其一是在定义结构时，将指针作为结构中的一个成员；其二是指向结构的指针（称为结构指针）。前者同一般的结构成员一样可直接进行访问，后者是本节讨论的重点。<BR>结构指针说明的一般形式是：<BR>struct 结构类型名称 * 结构指针变量名；<BR>例如：struct date * pdate, today;<BR>说明了两个变量，一个是指向结构date的结构指针pdate，today是一个date结构变量。语句：<BR>pdate = &amp;today;<BR></SPAN></P>
<BLOCKQUOTE>
<P><SPAN class=v9>pdate today (struct date)</SPAN></P></BLOCKQUOTE>
<P class=v9><SPAN class=v9>　　year</SPAN><BR>　　month<BR>　　day<BR>　&nbsp;</P>
<P class=v9>&nbsp; 通<SPAN class=v9>过结构变量today访问其成员的操作，也可以用等价的指针形式表示：<BR>today.year = 2001;　　等价于　　(*pdate).year = 2001;<BR>由于运算符"*"的优先级比运算符"."的优先级低，所以必须有"( )"将*pdate括起来。若省去括号，则含义就变成了"*(pdate.year)"。<BR>在Ｃ语言中，通过结构指针访问成员可以采用运算符"-&gt;"进行操作，对于指向结构的指针，为了访问其成员可以采用下列语句形式：<BR>结构指针-&gt;成员名;<BR>这样，上面通过结构指针pdate访问成员year的操作就可以写成：<BR>pdate-&gt;year = 2001;<BR>如果结构指针p指向一个结构数组，那么对指针p的操作就等价于对数组下标的操作。<BR>　　结构指针是指向一种结构类型的指针变量，它是结构在内存中的首地址，结构指针具有一般指针的特性，如在一定条件下两个指针可以进行比较，也可以与整数进行加减。但在指针操作时应注意：进行地址运算时的放大因子由所指向的结构的实际大小决定。<BR>例11-7：用结构指针改写加密程序。<BR>#include "stdio.h"<BR>struct table<BR>{ char input, output;<BR>} ;<BR>struct table translate[ ]=<BR>{ 'a', 'd', 'b', 'w', 'c', 'k', 'd', ';' , 'e', 'i',<BR>'i', 'a', 'k', 'b', ';', 'c', 'w', 'e'<BR>}; 　　　　　　/* 建立加密对照表 */<BR>main( )<BR>{ char ch;<BR>struct table *p, *pend; /* p和pend为指向结构table的指针 */<BR>pend = &amp; translate[ sizeof(translate)/sizeof(struct table)-1 ];<BR>/* pend指向结构数组translate的最后一个元素 */<BR>while ( (ch=getchar( )) != '\n')<BR>{ for ( p=translate ; p-&gt;input!=ch &amp;&amp; p!=pend; p++ ) ;<BR>if ( p-&gt;input==ch )<BR>putchar( p-&gt;output);<BR>else<BR>putchar (ch);<BR>}<BR>}</SPAN></P>
<BLOCKQUOTE>
<P><SPAN class=v9><BR>读者可以将两个程序对照阅读，体会结构指针特点。程序中用pend指向数组的最后一个元素。<BR>由于结构指针和在结构中将指针作为成员，使得对于结构变量的运算和对成员的操作变得较为复杂。由于取内容的"*"与"."和"-&gt;"运算符的优先级与结合性不同，使得对成员的访问和操作又增加了一层难度，再因为"++"和"--"运算所具有的"先操作"与"后操作"的特性，以及"++"和"--"运算的结合性，使得"++"和--"运算与结构操作混合在一起时，实际操作会更为复杂。</SPAN></P>
<P><SPAN class=v9><BR>例11-8：请分析程序的运算结果。<BR>#include "stdio.h"<BR>struct s<BR>{ int x, *y; /* y: 结构中的成员是指向整型的指针 */<BR>} *p; /* p: 指向结构的指针 */<BR>int data[5]={10, 20, 30, 40, 50,}; /* data: 整型数组 */<BR>struct s array[5]=<BR>{ 100, &amp;data[0], 200, &amp;data[1], 300, &amp;data[2],<BR>400, &amp;data[3], 500, &amp;data[4]<BR>}; /* array: 结构数组 */<BR>main ( )<BR>{ p=array; /* 指针p指向结构数组的首地址 */<BR>printf ("For printer:\n");<BR>printf ("%d\n", p-&gt;x);<BR>printf ("%d\n", (*p).x); <BR>printf ("%d\n", *p-&gt;y);<BR>printf ("%d\n", *(*p).y);<BR>printf ("%d\n", ++p-&gt;x);<BR>printf ("%d\n", (++p)-&gt;x);<BR>printf ("%d\n", p-&gt;x++);<BR>printf ("%d\n", p-&gt;x); <BR>printf ("%d\n", ++ (*p-&gt;y));<BR>printf ("%d\n", ++ * p-&gt;y); <BR>printf ("%d\n", * ++ p-&gt;y);<BR>printf ("%d\n", p-&gt;x); <BR>printf ("%d\n", * (++p)-&gt;y);<BR>printf ("%d\n", p-&gt;x); <BR>printf ("%d\n", * p-&gt;y ++);<BR>printf ("%d\n", p-&gt;x); <BR>printf ("%d\n", * (p-&gt;y) ++);<BR>printf ("%d\n", p-&gt;x); <BR>printf ("%d\n", * p ++ -&gt;y);<BR>printf ("%d\n", p-&gt;x);<BR>}</SPAN></P>
<P><SPAN class=v9><BR>结构数组array的初始化后的状态如图11.4所示。程序中指针操作的含义如下：<BR>p-&gt;x /* 取结构指针p指向的结构的成员x的值，输出 100 */<BR>(*p).x /* 取结构指针p的内容的成员x的值，功能同上，输出 100 */<BR>*p-&gt;y /* 取结构指针p的指针成员y的内容，输出 10 */<BR>*(*p).y /* 取结构指针p的内容的指针成员y的内容，功能同上，输出10 */<BR>++p-&gt;x /* p所指的x加1，x先加1后再输出 101 ，p不加1 */<BR>(++p)-&gt;x /* p先加1后再取x的值，x不加1，输出 200 */<BR>p-&gt;x++ /* 先取x的值后x再加1，输出 200 */<BR>p-&gt;x /* 输出 201 */<BR>++(*p-&gt;y) /* p所指的y的内容先加1，输出 21 ，p不加1，y也不加1 */<BR>++ *p-&gt;y /* 同上，由运算的结合性隐含了括号，输出 22 */<BR>* ++p-&gt;y /* y先加1后再取y的内容，输出30，p不加1，y的内容不加1 */<BR>p-&gt;x /* 输出 201 */<BR>*(++p)-&gt;y /* p先加1后取所指y的内容，输出 30 */<BR>p-&gt;x /* 输出 300 */<BR>*p-&gt;y ++ /* 取p所指的y的内容，输出 30，然后p所指的y加1 */<BR>p-&gt;x /* 输出 300 */<BR>*(p-&gt;y)++ /* 取p所指的y的内容，输出 40，然后p所指的y加1 */<BR>p-&gt;x /* 输出 300 */<BR>*p++-&gt;y /* 取p所指的y的内容，输出 50，然后p加1 */<BR>p-&gt;x /* 输出 400 */</SPAN></P></BLOCKQUOTE>
<P class=v9>程序运行结束时，指针与结构数组array的状态如图11-7所示。</P>
<TABLE width=700 border=0>
<TBODY>
<TR>
<TD></TD></TR></TBODY></TABLE>
<BLOCKQUOTE>
<P><SPAN class=v9>例11-9：可用一个结构表示学生的学号和成绩，编写程序，对班中30名学生按成绩进行排序，并输出排序后的学号、成绩和全班平均分。<BR>#include &lt;stdio.h&gt;<BR>#define STNUM 30 /* 全班同学人数 */<BR>struct stuinf<BR>{ int stid; /* 学生学号 */<BR>int score; /* 学生成绩 */<BR>} stu[STNUM]; /* stu: 结构数组 */<BR>main ( )<BR>{ struct stuinf *ptemp, /* ptemp:指向结构的指针, 临时变量 */<BR>*p[STNUM]; /* p:指向结构的指针构成的指针数组 */<BR>int i, j, k, sum=0; /* i,j,k:临时变量；sum:分数累计 */<BR>for (i=0; i&lt;=STNUM-1; i++) /* 输入学生的学号和成绩 */<BR>{ scanf ("%d%d", &amp;stu[i].stid, &amp;stu[i].score); /* 输入学生的学号和成绩 */<BR>p[i] = &amp;stu[i];<BR>/* 指针数组p[i]的第i个指针(元素)指向结构数组的第i个元素 */<BR>sum += stu[i].score;　　 　 　/* 累计学生的分数 */<BR>}<BR>for ( i=0; i&lt;=STNUM-2; i++ ) /* 排序操作 */<BR>{ k = i; /* k：在第i次循环中，指向当前最高分的指针在指针数组p中的下标 */<BR>for (j=i; j&lt;=STNUM-1; j++)<BR>if (p[k]-&gt;score &lt; p[j]-&gt;score) k=j;<BR>/* 查找当前最大值, k中存放最大值对应的指针在指针数组p中的下标 */<BR>if ( k!=i ) /* 当k不等于i时，交换两个指向结构的指针 */<BR>{ ptemp = p[i];<BR>p[i] = p[k];<BR>p[k] = ptemp;<BR>}<BR>}<BR>for (i=0; i&lt;=STNUM-1; i++) /* 按排序顺序输出学号和成绩 */<BR>printf("%d,%d\n", (*p[i]).stid, p[i]-&gt;score);<BR>printf ("average score = %d\n", sum/STNUM); /* 输出平均分 */<BR>}</SPAN></P><SPAN class=v9>
<P><BR>　　程序中使用了较为复杂的数据结构，包括：结构数组stu，指向结构的指针ptemp，由指向结构的指针构成的指针数组p。<BR>程序在结构数组stu和指针数组p之间建立了对应的指针关系，从而为简化后续处理打下了良好的基础。在排序过程中，程序使用选择排序的思想，先查找确定当前的最大值，再进行一次有实效的数据交换。进行数据交换时，也没有交换结构数据本身，而是交换了指向结构数据的指针。在输出时，按照排序后指针的顺序，输出排序后的数据。</P></SPAN></BLOCKQUOTE><img src ="http://www.cppblog.com/lance123/aggbug/707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lance123/" target="_blank">无情雨</a> 2005-10-19 00:49 <a href="http://www.cppblog.com/lance123/articles/707.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习C++的函数</title><link>http://www.cppblog.com/lance123/articles/498.html</link><dc:creator>无情雨</dc:creator><author>无情雨</author><pubDate>Thu, 29 Sep 2005 15:06:00 GMT</pubDate><guid>http://www.cppblog.com/lance123/articles/498.html</guid><wfw:comment>http://www.cppblog.com/lance123/comments/498.html</wfw:comment><comments>http://www.cppblog.com/lance123/articles/498.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lance123/comments/commentRss/498.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lance123/services/trackbacks/498.html</trackback:ping><description><![CDATA[<P>函数也就是一种功能,首先要声明或者定义他,包括返回类型,函数名,参数表这三个方面,最重要的就是函数的调用,他分二种:一是按值传递,形参的改变不会影响实参,中间只是一个值的传递,形参只是实参的一个拷贝,等函数调用完后,形参并释放.另外一种就是引用类型,其中有地址传递,比如数组和类的对象,这些把实参的地址传递给形参,从而形参的改变会影响到实参,还有就是引用参数,直接把实参代入形参,代替它,这种效率要快,有时为了让对象的形参不影响他,就是在前面加const,<BR>void sort(const vector T&amp;,const vectorT&amp;);这样就可以避免发生这种情况了.<BR>函数重载也是很重要的.一个函数名相同,形参个数或类型不同的几个函数,但他们有着相似的功能,通过参数来区别调用哪个函数.<BR>第一次写一些笔记,就写这么快吧?打字实在太慢了,不愿意写..</P><img src ="http://www.cppblog.com/lance123/aggbug/498.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lance123/" target="_blank">无情雨</a> 2005-09-29 23:06 <a href="http://www.cppblog.com/lance123/articles/498.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>