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

📄 00000010.htm

📁 一份很好的linux入门资料
💻 HTM
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人:&nbsp;<A HREF="mailto:ax.bbs@bbs.ee.nthu.edu.tw.">ax.bbs@bbs.ee.nthu.edu.tw.</A>&nbsp;(athena),&nbsp;信区:&nbsp;test&nbsp;<BR>标&nbsp;&nbsp;题:&nbsp;星星流讲座&nbsp;0034&nbsp;<BR>发信站:&nbsp;☆清华电机☆&nbsp;(Thu&nbsp;Jul&nbsp;&nbsp;6&nbsp;13:57:40&nbsp;1995)&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>第&nbsp;5&nbsp;讲&nbsp;之&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;阵列与指标&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Topic:&nbsp;Differences&nbsp;between&nbsp;pointers&nbsp;and&nbsp;arrays&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>我们前面的程式,如果把&nbsp;printf&nbsp;改一改,会得到三种不同的结果:&nbsp;<BR>&nbsp;<BR>1.&nbsp;printf&nbsp;(&quot;%s&nbsp;%s\n&quot;,&nbsp;lineptr[0],&nbsp;*(lineptr&nbsp;+&nbsp;1));&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;执行结果:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I&nbsp;am&nbsp;a&nbsp;student&nbsp;I&nbsp;am&nbsp;a&nbsp;teacher&nbsp;<BR>&nbsp;<BR>2.&nbsp;printf&nbsp;(&quot;%s&nbsp;%s\n&quot;,&nbsp;lineptr[0],&nbsp;*(++lineptr));&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wrong&nbsp;type&nbsp;argument&nbsp;to&nbsp;increment&nbsp;<BR>&nbsp;<BR>3.&nbsp;printf&nbsp;(&quot;%s\n&quot;,&nbsp;++*lineptr);&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;执行结果:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;am&nbsp;a&nbsp;student&nbsp;<BR>&nbsp;<BR>先看第三个,++*lineptr&nbsp;的意思是把&nbsp;*lineptr&nbsp;加&nbsp;1。那&nbsp;*lineptr&nbsp;又是&nbsp;<BR>什麽东西呢?&nbsp;*lineptr&nbsp;就是指向&nbsp;I&nbsp;am&nbsp;a&nbsp;student&nbsp;这个字串的指标,你把&nbsp;<BR>这个指标加&nbsp;1,这个时候字串开头的字元&nbsp;I&nbsp;自然被「吃掉」了,所以执行&nbsp;<BR>结果变成只剩&nbsp;am&nbsp;a&nbsp;student&nbsp;被印出来。&nbsp;<BR>&nbsp;<BR>比较有意思的问题是,第一个是把&nbsp;lineptr&nbsp;加&nbsp;1&nbsp;之後,印出它所指向的字&nbsp;<BR>串,也就是第一个相当於&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;%s&nbsp;%s\n&quot;,&nbsp;lineptr[0],&nbsp;lineptr[1]);&nbsp;<BR>&nbsp;<BR>但是第二个&nbsp;printf&nbsp;也是把&nbsp;lineptr&nbsp;加&nbsp;1,为什麽&nbsp;compiler&nbsp;会给我们错误&nbsp;<BR>讯息呢?这是因为阵列虽然可以用指标的观念来看待,但是对编译器而言,&nbsp;<BR>阵列与指标的资料型态&nbsp;(data&nbsp;type)&nbsp;并不相同。由於阵列的资料型态不可以&nbsp;<BR>使用&nbsp;++&nbsp;这个运算元&nbsp;(你想&nbsp;++&nbsp;阵列的那一个元素呢?),所以这个程式会在&nbsp;<BR>编译时发生错误。请你看看下面的程式比较一下:&nbsp;<BR>&nbsp;<BR>/*&nbsp;pa.c&nbsp;*/&nbsp;<BR>#include&nbsp;&lt;stdio.h&gt;&nbsp;<BR>#include&nbsp;&lt;string.h&gt;&nbsp;<BR>&nbsp;<BR>void&nbsp;foo&nbsp;(char&nbsp;**lineptr);&nbsp;<BR>void&nbsp;main&nbsp;(void)&nbsp;<BR>{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;s1[20],&nbsp;s2[20],&nbsp;s3[20];&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*lineptr[3];&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;strcpy&nbsp;(s1,&nbsp;&quot;I&nbsp;am&nbsp;a&nbsp;student&quot;);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;strcpy&nbsp;(s2,&nbsp;&quot;I&nbsp;am&nbsp;a&nbsp;teacher&quot;);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;strcpy&nbsp;(s3,&nbsp;&quot;I&nbsp;am&nbsp;an&nbsp;audiance&quot;);&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;lineptr[0]&nbsp;=&nbsp;s1;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;lineptr[1]&nbsp;=&nbsp;s2;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;lineptr[2]&nbsp;=&nbsp;s3;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;foo&nbsp;(lineptr);&nbsp;<BR>}&nbsp;<BR>&nbsp;<BR>void&nbsp;foo&nbsp;(char&nbsp;**lineptr)&nbsp;<BR>{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;%s\n&quot;,&nbsp;*++lineptr);&nbsp;<BR>}&nbsp;<BR>&nbsp;<BR>执行结果:&nbsp;<BR>&nbsp;<BR>I&nbsp;am&nbsp;a&nbsp;teacher&nbsp;<BR>&nbsp;<BR>这里为什麽就可以这样儿做了呢?请看&nbsp;foo&nbsp;的参数:&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;foo&nbsp;(char&nbsp;**lineptr)&nbsp;<BR>&nbsp;<BR>阵列在传给&nbsp;foo&nbsp;这个函数之前,已经经由隐含的型态转换转变成&nbsp;<BR>char&nbsp;**&nbsp;型态了,而非原来宣告的&nbsp;*&nbsp;char&nbsp;[]&nbsp;型态,所以可以安心地&nbsp;<BR>使用&nbsp;++&nbsp;这个运算元。&nbsp;<BR>&nbsp;<BR>--&nbsp;<BR>本文原作者为徐振家,原作刊载於星星神教总坛&nbsp;☆清华电机☆&nbsp;test&nbsp;板。&nbsp;<BR>你可以以电子文件的形式将本文自由流传於台湾学术网路,但必须包含此版权声明。&nbsp;<BR>原作者依中华民国著作权法之规定,享有本文之著作权,请勿抄袭以免触法。&nbsp;<BR>未经授权任何人不得以任何形式对本文做任何修改及商业上之应用。&nbsp;<BR>其他网路的转载或其他用途的应用,请先知会作者,并取得其同意。&nbsp;<BR>对本文有任何疑问或意见请&nbsp;mail&nbsp;给&nbsp;<A HREF="mailto:ax.bbs@bbs.ee.nthu.edu.tw,谢谢。">ax.bbs@bbs.ee.nthu.edu.tw,谢谢。</A>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -