??xml version="1.0" encoding="utf-8" standalone="yes"?>无码人妻久久久一区二区三区 ,伊人久久一区二区三区无码,99久久综合狠狠综合久久http://www.shnenglu.com/geforcex/category/429.htmlzh-cnThu, 22 May 2008 16:26:51 GMTThu, 22 May 2008 16:26:51 GMT60DES法?/title><link>http://www.shnenglu.com/geforcex/articles/7762.html</link><dc:creator>geforceX</dc:creator><author>geforceX</author><pubDate>Sun, 28 May 2006 02:50:00 GMT</pubDate><guid>http://www.shnenglu.com/geforcex/articles/7762.html</guid><wfw:comment>http://www.shnenglu.com/geforcex/comments/7762.html</wfw:comment><comments>http://www.shnenglu.com/geforcex/articles/7762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/geforcex/comments/commentRss/7762.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/geforcex/services/trackbacks/7762.html</trackback:ping><description><![CDATA[ <img height="10" src="http://www.infosecurity.org.cn/article/images/2005061301/200561320243474877801.gif" width="10" border="0" /> <font color="#003399"> <b>1 ?/b> </font> <br />  DES是Data Encryption StandardQ数据加密标准)的羃写。它是由IBM公司研制的一U加密算法,国国家标准局?977q公布把它作为非部门使用的数据加密标准,二十q来Q它一直活跃在国际保密通信的舞CQ扮演了十分重要的角色[10]?br />  DES是一个分l加密算法,他以64位ؓ分组Ҏ据加密。同时DES也是一个对U算法:加密和解密用的是同一个算法。它的密匙长度是56位(因ؓ每个W?位都用作奇偶校验Q,密匙可以是Q意的56位的敎ͼ而且可以L时候改变。其中有极少量的数被认ؓ是弱密匙Q但是很Ҏ避开他们。所以保密性依赖于密钥?br /><b><font color="#003399"><img height="10" src="http://www.infosecurity.org.cn/article/images/2005061301/200561320243474877801.gif" width="10" border="0" /> 2 法框架[11]</font></b>Q?br />  DES?4(bit)位的明文分组Mq行操作QMl过一个初始置换IP|换成m0Q将m0明文分成左半部分和右半部分m0=(L0,R0)Q各32位长。然后进?6轮完全相同的q算Q这些运被UCؓ函数fQ在q算q程中数据与密匙l合。经q?6轮后Q左Q右半部分合在一Lq一个末|换Q这样就完成了[12]?br />  在每一轮中Q密匙位UMQ然后再从密匙的56位中选出48位。通过一个扩展置换将数据的右半部分扩展成48位,q过一个异或操作替代成新的32位数据,在将其置换换一ơ。这四步q算构成了函数f。然后,通过另一个异或运,函数f的输Z左半部分l合Q其l果成ؓ新的叛_部分Q原来的叛_部分成ؓ新的左半部分。将该操作重?6ơ,实C。具体图4所C?br /><br />     <img src="http://www.shnenglu.com/images/cppblog_com/geforcex/275/r_200561320243475877802.jpg" /><br /><br />                               ? DES法框图<br /><br /><b><font color="#003399"><img height="10" src="http://www.infosecurity.org.cn/article/images/2005061301/200561320243474877801.gif" width="10" border="0" /> 3 DES解密</font></b><br />  在经q所有的代替、置换、异或盒循环之后Q你也许认ؓ解密法与加密算法完全不同。恰恰相反,l过_ֿ选择的各U操作,获得了一个非常有用的性质Q加密和解密使用相同的算法?br />DES加密和解密唯一的不同是密匙的次序相反。如果各轮加密密匙分别是K1,K2,K3?K16那么解密密匙是K16,K15,K14…K1?br /><b><font color="#003399"><img height="10" src="http://www.infosecurity.org.cn/article/images/2005061301/200561320243474877801.gif" width="10" border="0" /> 4 DES的几U工作方?/font></b><br />  <font color="#cc3300">W一U电子密本方式(ECBQ?/font><br />   明文分成n?4比特分组Q如果明文长度不?4比特的倍数Q则在明文末֡充适当数目的规定符受对明文l用l定的密钥分别进行加密,行密文C=(C0,C1,…?Cn-1)其中Ci=DES(K,xi),i=0,1,?.,n-1?br />  <font color="#cc3300">W二U密文分l链接方式(CBCQ?/font><br />   在CBC方式下,每个明文lxi在加密前与先一l密文按位模二加后,再送到DES加密QCBC方式克服了ECB方式报内l重的缺点,但由于明文组加密前与一l密文有养I因此前一l密文的错误会传播到下一l?br />  <font color="#cc3300">W三U密文反馈方式(CFBQ,可用于序列密?/font><br />   明文XQ?x0,x1,…?xn-1)Q其中xi由t个比特组?<t?4。cfb实际上将des作ؓ一个密钥流发生器,在t比特密文的反馈下Q每ơ输出t比特乱数对t比特明文q行加密。由于cfb是密文反馈,它对密文错误较敏感,t比特密文中只要有一个比牚w误,׃Dq箋Ct 比特出错?br="">   <font color="#cc3300">W四U输出反馈方式(OFBQ,可用于序列密?/font><br />   与CFB唯一不同的是OFB是直接取DES输出的t个比特,而不是取密文的t个比特,其余都与CFB相同。但它取的是DES的输出,所以它克服了CFB的密文错误传播的~点 </t?4。cfb实际上将des作ؓ一个密钥流发生器,在t比特密文的反馈下Q每ơ输出t比特乱数对t比特明文q行加密。由于cfb是密文反馈,它对密文错误较敏感,t比特密文中只要有一个比牚w误,׃Dq箋Ct><img src ="http://www.shnenglu.com/geforcex/aggbug/7762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/geforcex/" target="_blank">geforceX</a> 2006-05-28 10:50 <a href="http://www.shnenglu.com/geforcex/articles/7762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>scanf()函数释疑Q下Q?/title><link>http://www.shnenglu.com/geforcex/articles/2135.html</link><dc:creator>geforceX</dc:creator><author>geforceX</author><pubDate>Mon, 26 Dec 2005 09:13:00 GMT</pubDate><guid>http://www.shnenglu.com/geforcex/articles/2135.html</guid><wfw:comment>http://www.shnenglu.com/geforcex/comments/2135.html</wfw:comment><comments>http://www.shnenglu.com/geforcex/articles/2135.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/geforcex/comments/commentRss/2135.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/geforcex/services/trackbacks/2135.html</trackback:ping><description><![CDATA[   在上我已经表达了两个观点,q里再重申一ơ:1。本文仅对scanf()函数控制串运用进行探讨,本文所有例Eƈ不构成编E徏议?。凡事要亲力而ؓQ不同^C同编译器Q可能会有不同结果。本文所有例E均在WIN-TC+windows Me下调试? <P><FONT face=黑体 size=3>四、scanf()函数控制串运用出现的常见错误及对{技?/FONT></P> <P><FONT face=楷体_GB2312 size=4>问题一Q?nbsp;  E序~译通过Q但q行错误提示如下Q?BR>           scanf : floating point formats not linked<BR>           Abnormal program termination</FONT> </P> <P>出错CZE序Q?/P> <P>#include <stdio.h><BR>int main(void)<BR>{<BR>    int i,j ;<BR>    float s[3][3];<BR>    <BR>    /*q里*/<BR>    <BR>    for(i=0;i<3;i++)<BR>    for(j=0;j<3;j++)<BR>    scanf("%f",&s[i][j]);</P> <P>    for(i=0;i<3;i++)<BR>    for(j=0;j<3;j++)<BR>    printf("%f",s[i][j]);<BR>}</P> <P>    q实际上是个与本文主题无关的问题Q也是与scanf()函数无关Q是~译器的问题?/P> <P>    原因很明:没有链接点库。早期系l内存资源紧张,多维点数组占用内存量大Q一lQҎl就没有此问题)Q因此TC在编译时量不加入无关的部分Q在没发现需要Q点{换程序时Q就不在可执行程序中安装q个部分。而有时TC又不能正识别实际上实需要做点转换Q因此就会出C面错误?/P> <P>    解决的方法:告诉TC需要做点数的输入转换。将以下语句加入上面E序中标?*q里*/处?/P> <P>Ҏ一:  float c;<BR>         scanf("%f",&c);</P> <P>Ҏ?  float c,*t<FONT color=#ff0000>;//此处手误Q现已更</FONT><FONT color=#f70909>?amp;t===?t;</FONT></P> <P>         t=&c;<BR>.....</P> <P>    也就是说Q编译器只要有Q点{换的U烦QTC׃把Q点{换连?所以一般大一点的E序里的׃有Q点变量反而没有此问题?BR>    <BR>    但问题到此ƈ没结束,我在上面有句“一lQҎl就没有此问题”,那么我们来看看这栯不行Q?/P> <P>#include <stdio.h><BR>int main(void)<BR>{<BR>    int i,j ;<BR>    float s[3][3],*ptr;<BR>    <BR>    ptr=&s[0][0];<BR>   <BR>    <BR>    for(i=0;i<3;i++)<BR>    for(j=0;j<3;j++)<BR>    scanf("%f",ptr+i*3+j);</P> <P>    for(i=0;i<3;i++)<BR>    for(j=0;j<3;j++)<BR>    printf("%7.2f\n",s[i][j]);<BR>}</P> <P>    q样我们把多维点数组降ؓ一lQҎl来处理Q调试一下,E序q行正常。这说明TC~译器仅在处理多lQҎl(l构体)有此“未链接点库”的问题?/P> <P><FONT face=楷体_GB2312 size=4>问题二:scanf()函数不能正确接受有空格的字符Ԍ? I love you!</FONT></P> <P><BR>#include <stdio.h><BR>int main()<BR>{<BR>    char str[80];<BR>    <BR>    scanf("%s",str);<BR>    printf("%s",str);</P> <P>    return 0;<BR>}</P> <P>输入QI live you!<BR>输出QI</P> <P>       scanf()函数接收输入数据Ӟ遇以下情늻束一个数据的输入Q(不是l束该scanf函数Qscanf函数仅在每一个数据域均有数据Qƈ按回车后l束Q?BR>        ?遇空根{“回车”、“蟩格”键?BR>        ?遇宽度结束?BR>        ?遇非法输入?/P> <P>所以,上述E序q不能达到预期目的,scanf()扫描?I"后面的空格就认ؓ对str的赋值结束,q忽略后面的"love you!".q里要注意是"love you!"q在<FONT color=#0909f7>键盘~冲?/FONT><FONT color=#ff0000>Q关于这个问题,|上我所见的说法都是如此Q但是,我经q调试发玎ͼ其实q时~冲区字W串首尾指针已经相等了,也就是说~冲区清IZQscanf()函数应该只是扫描stdin,q个D存信息是在stdin?</FONT>。我们改动一下上面的E序来验证一下:</P> <P>#include <stdio.h><BR>int main()<BR>{<BR>    char str[80];<BR>    char str1[80];<BR>    char str2[80];<BR>    <BR>    scanf("%s",str);/*此处输入:I love you!  */<BR>    printf("%s",str);<BR>    sleep(5);/*q里{待5U?告诉你程序运行到什么地?/<BR>    scanf("%s",str1);/*q两句无需你再输入,是对键盘盘缓冲区再扫?nbsp;  */<BR>    scanf("%s",str2);/*q两句无需你再输入,是对键盘盘缓冲区再扫?nbsp;   */<BR>    printf("\n%s",str1);<BR>    printf("\n%s",str2);<BR>    return 0;<BR>}</P> <P>输入QI love you!<BR>输出QI<BR>      love<BR>      you!</P> <P>好了Q原因知道了Q那么scanf()函数能不能完成这个Q务?回答是:能!别忘了scanf()函数q有一?%[] 格式控制W(如果?[]不了解的h看本文的上篇Q?L下面的程序:</P> <P>#include "stdio.h"<BR>int main()<BR>{<BR>    char string[50];<BR>    <BR>     /*scanf("%s",string);不能接收I格W?/<BR>     scanf("%[^\n]",string);<BR>     printf("%s\n",string);<BR>     return 0;<BR>}</P> <P><FONT face=楷体_GB2312 size=4>问题三:键盘~冲区残余信息问?/FONT></P> <P><BR>#include <stdio.h><BR>int main()<BR>{<BR>    int a;<BR>    char c;</P> <P>    do<BR>    {<BR>        scanf("%d",&a);<BR>        scanf("%c",&c);<BR>        printf("a=%d     c=%c\n",a,c);<BR>        /*printf("c=%d\n",c);*/<BR>    }while(c!='N');<BR>}</P> <P>   scanf("%c",&c);q句不能正常接收字符,什么原因呢Q我们用printf("c=%d\n",c);C用int表示出来Q启用printf("c=%d\n",c);q一句,看看scanf()函数赋给C到底是什么,l果?c=10 ,ASCIIgؓ10是什么?换行即\n.对了Q我们每L一?Enter"键,向键盘缓冲区发去一个“回车?\r),一个“换?(\n),在这里\r被scanf()函数处理掉了Q姑且这么认为吧^_^Q,而\n被scanf()函数“错误”地赋给了c.</P> <P>解决办法Q可以在两个scanf()函数之后加个fflush(stdin);Q还有加getch(); getchar();也可以,但是要视具体scanf()语句加那个,q里׃分析了,读者自己去摸烦吧。但是加fflush(stdin);不管什么情况都可行?/P> <P>函数? fflush <BR>?nbsp; ? 清除一个流 <BR>?nbsp; ? int fflush(FILE *stream); </P> <P>#include <stdio.h><BR>int main()<BR>{<BR>    int a;<BR>    char c;</P> <P>    do<BR>    {<BR>        scanf("%d",&a);<BR>        fflush(stdin);<BR>        scanf("%c",&c);<BR>        fflush(stdin);<BR>        printf("a=%d     c=%c\n",a,c);</P> <P>    }while(c!='N');<BR>}      </P> <P>q里再给一个用“空格符”来处理~冲区残余信息的CZQ?/P> <P>q行出错的程序:</P> <P>#include <stdio.h><BR>int main()<BR>{<BR>    int i;<BR>    char j;<BR>    for(i = 0;i < 10;i++)<BR>    {<BR>        scanf("%c",&j);/*q里%前没有空?/<BR>    }<BR>}</P> <P>使用了空格控制符后:</P> <P>#include <stdio.h><BR>int main()<BR>{<BR>    int i;<BR>    char j;<BR>    for(i = 0;i < 10;i++)<BR>    {<BR>        scanf(" %c",&j);/*注意q里%前有个空?/<BR>    }<BR>}</P> <P>    可以q行看看两个E序有什么不同?/P> <P><FONT face=楷体_GB2312 size=4>问题?nbsp;  如何处理scanf()函数误输入造成E序死锁或出错?</FONT></P> <P>#include <stdio.h><BR>int main()<BR>{<BR>  int a,b,c;  /*计算a+b*/</P> <P>  scanf("%d,%d",&a,&b);<BR>  c=a+b;<BR>  printf("%d+%d=%d",a,b,c);<BR>}</P> <P>如上E序Q如果正输入a,b的|那么没什么问题,但是Q你不能保证使用者每一ơ都能正输入,一旦输入了错误的类型,你的E序不是死锁Q就是得C个错误的l果,呵呵Q这可能所有h都遇到过的问题吧Q?/P> <P>解决ҎQscanf()函数执行成功时的q回值是成功d的变量数,也就是说Q你q个scanf()函数有几个变量,如果scanf()函数全部正常dQ它p回几。但q里q要注意另一个问题,如果输入了非法数据,键盘~冲区就可能q个有残余信息问题?/P> <P>正确的例E:</P> <P>#include <stdio.h><BR>int main()<BR>{<BR>  int a,b,c;  /*计算a+b*/</P> <P>  while(scanf("%d,%d",&a,&b)!=2)fflush(stdin);<BR>  c=a+b;<BR>  printf("%d+%d=%d",a,b,c);<BR>}</P> <P>        此l束此文?最后还得照例谦虚几?本h水^有限(的的确有限^_^,q到是真?,谬误隑օq望达h指点一?在下在此谢过?<BR>(全文?</P> <P>                                                              knocker      2004.10.21</P><img src ="http://www.shnenglu.com/geforcex/aggbug/2135.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/geforcex/" target="_blank">geforceX</a> 2005-12-26 17:13 <a href="http://www.shnenglu.com/geforcex/articles/2135.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>scanf()函数释疑Q上Q?/title><link>http://www.shnenglu.com/geforcex/articles/2134.html</link><dc:creator>geforceX</dc:creator><author>geforceX</author><pubDate>Mon, 26 Dec 2005 09:11:00 GMT</pubDate><guid>http://www.shnenglu.com/geforcex/articles/2134.html</guid><wfw:comment>http://www.shnenglu.com/geforcex/comments/2134.html</wfw:comment><comments>http://www.shnenglu.com/geforcex/articles/2134.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/geforcex/comments/commentRss/2134.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/geforcex/services/trackbacks/2134.html</trackback:ping><description><![CDATA[<P><FONT face=黑体 size=3>一、序a</FONT>                          </P> <P>    scanf()函数是所有C语言学习者在学习C语言q程中所遇到的第二个函数Q第一个函数是printf(),Brian W.Kerninghan & Dennis M.Ritchie的“hello,world”程序基本上是所有的C语言学习者第一个范例)Q所以scanf()函数应当是C学习者能熟练q用的一个函敎ͼ但有很多初学者对此函C能很好的q用Q在实际~程中错误用scanf()函数Q导至程序生某U错误不能正常运行,以至产生“scanf()函数有BUG”,“scanf()函数无用论”等{错误观炏V?BR>    本文l合W者在~程实践中及论坛上网友所遇到的问题作一释疑Q但W者水qx限(菜鸟U)Q难免有谬误之处Q还望达人指点一二。(Email:knocker.k@126.com)<BR>    本文分上Q下两篇讲述了C语言中的scanf()函数的用法,重点阐述使用scanf()函数q程中出现的常见错误及对{。当Ӟ文中某些解决ҎQ均可以采用其他函数和方法来更好地解冻I但本文仅限讨论scanf()函数本n?BR>    上篇Q详l介l了scanf()函数控制串的构成。下,用实际例E介lscanf()函数控制串运用出现的常见错误及对{技巧?/P> <P><FONT face=黑体 size=4>二、scanf()函数的控制串</FONT></P> <P>函数? scanf <BR>?nbsp; ? 执行格式化输?<BR>?nbsp; ? int scanf(char *format[,argument,...]);</P> <P>scanf()函数是通用l端格式化输入函敎ͼ它从标准输入讑֤(键盘) d输入的信息。可以读入Q何固有类型的数据q自动把数值变换成适当的机内格式?/P> <P>其调用格式ؓ:      scanf("<格式化字W串>"Q?lt;地址?gt;);</P> <P>scanf()函数q回成功赋值的数据ҎQ出错时则返回EOF?/P> <P>其控制串׃cdW构成:</P> <P>1。格式化说明W;<BR>2。空白符Q?BR>3。非I白W;</P> <P><BR>QAQ?nbsp;               格式化说明符</P> <P><BR>格式字符           说明</P> <P>%a                 d一个Q点?仅C99有效) <BR>%A                 同上<BR>%c                 d一个字W?BR>%d                 d十进制整?BR>%i                 d十进Ӟ八进Ӟ十六q制整数<BR>%o                 d八进制整?BR>%x                 d十六q制整数<BR>%X                 同上<BR>%c                 d一个字W?BR>%s                 d一个字W串<BR>%f                 d一个QҎ<BR>%F                 同上<BR>%e                 同上<BR>%E                 同上<BR>%g                 同上<BR>%G                 同上<BR>%p                 d一个指?BR>%u                 d一个无W号十进制整?BR>%n                 x已读入值的{h字符?BR>%[]                扫描字符集合<BR>%%                 ?W号<BR>                <BR>附加格式说明字符?/P> <P>修饰W?nbsp;                      说明</P> <P>L/l 长度修饰W?nbsp;              输入"?数据<BR>h 长度修饰W?nbsp;                输入"?数据<BR>W 整型常数                   指定输入数据所占宽?BR>* 星号                       I一个数?<BR>hh,ll同上h,l但仅对C99有效?/P> <P><BR>QBQ?nbsp;        I白字符 </P> <P>I白字符会scanf()函数在读操作中略去输入中的一个或多个I白字符Q空白符可以是space,tab,newline{等Q直到第一个非I白W出Cؓ止?/P> <P>QCQ?nbsp;       非空白字W?</P> <P>一个非I白字符会scanf()函数在读入时剔除掉与q个非空白字W相同的字符?</P> <P><BR>注:scanf()控制串知识就介绍到这里(应该比较齐全了^_^)Q如有遗漏下ơ补上。下面将l合实际例程Q一一阐述.</P> <P><FONT face=黑体 size=4>三、scanf()函数的控制串的?/FONT></P> <P>?.</P> <P>#include "stdio.h" <BR>int main(void) <BR>{ <BR>  int a,b,c; <BR>  <BR>  scanf("%d%d%d",&a,&b,&c);  <BR>  printf("%d,%d,%d\n",a,b,c);  <BR><BR>  return 0;<BR>}   </P> <P>q行时按如下方式输入三个|</P> <P>3?? ↙(输入a,b,c的|</P> <P>3Q?Q? Qprintf输出的aQbQc的|</P> <P>   Q?Q?&a?amp;b?amp;c中的&是地址q算W,分别获得q三个变量的内存地址?BR>   Q?Q?"%d%d%d"是按十进值格式输入三个数倹{输入时Q在两个数据之间可以用一个或多个I格、tab键、回车键分隔?BR>      以下是合法输入方式: <BR>      ?3□□4□□□□5?BR>      ?3?BR>         4??BR>      ?3Qtab键)4?BR>         5?/P> <P><BR>?.</P> <P>#include "stdio.h" <BR>int main(void) <BR>{ <BR>  int a,b,c; </P> <P>  scanf("%d,%d,%d",&a,&b,&c);<BR>  printf("%d,%d,%d\n",a,b,c);  </P> <P>  return 0;<BR>}   </P> <P>q行时按如下方式输入三个|</P> <P>3,4,5 ↙(输入a,b,c的|</P> <P>或?/P> <P>3,?,? ↙(输入a,b,c的|</P> <P>3,□□?,? ↙(输入a,b,c的|<BR>......<BR>都是合法的,但是","一定要跟在数字后面Q如Q?BR>3□,4,? ↙就非法了,E序出错。(解决Ҏ与原因后面讲Q?/P> <P>再如Q?/P> <P>1、sacnf()中的变量必须使用地址?/P> <P>         int a, b;<BR>scanf("%d%d",a,b); //错误<BR>scanf("%d%d",&a,&b); </P> <P>2、scanf()的格式控制串可以使用其它非空白字W,但在输入时必输入这些字W?/P> <P>例:<BR>scanf("%d,%d",&a,&b); <BR>输入Q?3Q? ↙(逗号?%d,%d"中的逗号对应Q?<BR>scanf("a=%d,b=%d",&a,&b); <BR>输入Q?a=3Qb=4 ↙("a=","b=",逗号?%d,%d"中的"a=","b="及逗号对应Q?/P> <P><BR>3、在?%c"输入ӞI格和“{义字W”均作ؓ有效字符?/P> <P>例:<BR>scanf("%c%c%c",&c1,&c2,&c3); <BR>输入Qa□b□c?<BR>l果Qa→c1Q□→c2Qb→c3 (其余被丢? </P> <P><BR>scanf()函数接收输入数据Ӟ遇以下情늻束一个数据的输入Q(不是l束该scanf函数Qscanf函数仅在每一个数据域均有数据Qƈ按回车后l束Q?BR>        ?遇空根{“回车”、“蟩格”键?BR>        ?遇宽度结束?BR>        ?遇非法输入?/P> <P><BR>    上篇写到这里吧Q第三小节的例程"?自网上的一个教E(原因有二Q一Q可以少打不字。二Q□↙我不知道怎么打。^_^)Qƈ删去其中的错误之?q里也顺便提醒本文读者一句:凡事要亲力而ؓQ即使是l典的书c也不免有疏漏之处,所以,用编译器说话是最可靠的,是对是错L译器告诉你?/P><img src ="http://www.shnenglu.com/geforcex/aggbug/2134.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/geforcex/" target="_blank">geforceX</a> 2005-12-26 17:11 <a href="http://www.shnenglu.com/geforcex/articles/2134.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数组和指针ȝhttp://www.shnenglu.com/geforcex/articles/1861.htmlgeforceXgeforceXSun, 18 Dec 2005 13:08:00 GMThttp://www.shnenglu.com/geforcex/articles/1861.htmlhttp://www.shnenglu.com/geforcex/comments/1861.htmlhttp://www.shnenglu.com/geforcex/articles/1861.html#Feedback0http://www.shnenglu.com/geforcex/comments/commentRss/1861.htmlhttp://www.shnenglu.com/geforcex/services/trackbacks/1861.html初学者往往知道数组和指针之间有联系Q但是具体的联系和限制却又搞不清楚,惛_q我也如此,q里将q方面的知识做个ȝ吧?/P>

1.定义

定义数组时必L定数l的cd和大,
定义指针时只需要指定类型?/FONT>

2.存储I间的分?/H2>


对于数组Q因为系l会按照你指定的大小为数l分配存储空_q也是ؓ什么数l必L定大的原因Q如Qchar array[5] ; //pȝ会自动ؓ光留sizeof(char)*5个字节的q箋内存Q注意是q箋的)。所以我们可以对array[0]...array[4]q五个变量随便访问(d写)都不会有问题?BR>对于指针Q系l只会ؓ所定义的指针变量分配空_指针所指向的地点ƈ未分配。D个例子: char *p ; q里会ؓ变量p分配I间Q大ؓ4字节Q?2位机Q,但是*pQ就是p指向的地方)却是随机的地方,q个地方pȝ也不为其分配I间。所以在q种情况下,你访问和lp赋|p=...)都是允许的,但是讉K*p或者给*p赋值都是错误的。我们要想?p必须先其指向有效区域,q可以通过动态申请内存或者赋|知道的有效地点赋给它)来实现?BR>提醒一下:对于指针Q在使用Ӟ不光所指向的区域能dQ指针变量本w也能读写,但是数组不同Q数l名的不能写的(允许读)。ؓ什么?因ؓ指针变量p有存储空_而数l名array是没有的?/P>

3.多指针


一U指针,char *p ; //p为指向charcd的指针变量?/P>

有了指针变量我们可以定义Q何类型的指针Q可以随心所Ʋ的用指针来讉KMcd的变量。但是有人发C问题Q用这U定义,我们无法用指针来操纵指针cdQ于是二U指针的定义被拿出来了?/P>

二指针是指向指针的指针,用来操纵一指针变量?BR>例:char **pp ;
定义的pp为指向一?指向一char变量的指?的指针?BR>我们可以?pp指向到前面定义的p : pp = &p ;
现在很容易看清他们之间个关系Q?BR>*pp是讉Kpp指向的位|,讉K的值当然就是p,
**pp是*(*pp)拉,当然{于*p.

注意 定义pp的时候,pȝ只ؓpp分配了空_q未?pp分配I间Q后来能讉K*pp是因为我们用pp=&ppp指向?amp;pq个已经分配好了的空间?/P>

同理Qؓ了控制二U指针于是有了三U指针,...

4.多维数组

char array[5];//定义了array为含?个char元素的数l?BR>二维数组的定义我׃多说了,怿大家知道得已l很详细了。我q里p一说他们的名称吧。提醒一下:他提出的愿意是我们希望得到arraycd的数l?BR>char arrayMulti[3][5] ;
前面说过数组名不是变量,那么它是怎么使用的呢Q?BR>其实数组名只是在~译时刻~译器用来定位变量位|的一个标{。比?array[3],那么~译器就认ؓ是“标{?3”,你如果写 array[6]Q那么编译器p为是“标{?6”,q就是C不会l出数组界错误的原因。那么arrayMulti是什么呢Q细Ml数l的定义Q我们定义的是一个数l的数组。我们写了这个定义,意味着我们已经有了 char [5] q种cd的数l,而现在我们要定义一个现有数l类型的数组arrayMulti 。ƈ且在以后的程序中他会永远记得它的元素的类型是char [5]Q所以你在访问他的元素arrayMulti[1]Ӟ他知道这是一个char[5]的数l。同样二l数l也不检查越界,所以你写arrayMulti[2][5]不会有问题?BR>提示Q编译器不检查数l的界Q但会检查数l元素的cdQ所以:
对于array ,你给array[0]一个int型的值是不行的,因ؓ他的元素是charcdQ?BR>对于arrayMulti,你他的元素一个char[6]的g是不行的Q详l例子见“蜕化”)?/P>

5.数组名的蜕化


数组在作为函数参数时Q数l名蜕化ؓ指针。C语言的书上是q么说的Q我q里要说得是Q这句话是不完全正确的!我们知道指针是占用内存的Q但是这个蜕化而成的家伙是不占有内存的Q仍然只是个标签。书上ؓ什么这么说呢?书上的意思是说这家伙已经蜕化得不知道自己有几个元素了。D个例子:
void fun(char array[5]);
在编译时~译器会当成?void fun(char *array);你在q个函数中用sizeof(a)得到的值是4Q而在定义char array[5]的函Csizeof(array) = 5,说明实已经蜕化为指针了。所以你写:
char *pa = array ; //正确Q指针到指针

数组名退化ؓ指针Q在q里一下:数组的元素类型仍然存在!q里要注意的是多l数l的情况?BR>?l数lؓ例:
void fun2(char arrayMulti[3][5]);
那么在函数fun2中,arrayMulti蜕化成的是char (*)[5],卻I指向char[5]cd的指针,因ؓ前面分析qarrayMulti的元素的cd是char[5]Q所以在E序中:
char **pm = arrayMulti ; //错误Q从char (*)[5]?char **的赋?BR>char (*pm5)[5] ;
pm5 = arrayMulti ; //正确?

6.对元素的讉K
数组名是一个标{,是一个记录地址的标{,在对元素的访问上所L作用和指针一P所以:
int a[5];
int *b;
b=a;
那么Q?BR>a[1],b[1],*(a+1),*(b+1)都是允许的?BR>更悬一点:因ؓ其在q儿所L作用仅仅是个标签而已Q编译的时候就是让两者相加)Q所以:
1[a],1[b],也是允许的?/P>

7.取地址
Ҏ针变量?amp;q算后得到的是指针变量的地址Q那么数l名呢?
他仅仅是个标{֕Q根本就没地方存放?BR>所以C语言中的规定是取数组地址的结果是Q仍然是其本w?BR>?&array 的值和 array一栗?BR>注意Q值是一Pcd是不一L?/P>

------------------------

虽然数组名的没有存储空_但把&a规定a的地址g样ƈ不是q个原因?BR>数组名是一个右|本来不符?amp;的语法的Q但是,数组却是一个对象,对一?BR>数组对象取地址是合理的QC标准委员会经q衡量,认ؓl护一个对象的完整?BR>更重要,因此允许&aQ只不过Q?amp;a的意义,q对一个数l名取地址Q而是?BR>一个数l对象取地址?/P>

geforceX 2005-12-18 21:08 发表评论
]]>
scanf()函数的用法和实践http://www.shnenglu.com/geforcex/articles/1327.htmlgeforceXgeforceXFri, 25 Nov 2005 14:19:00 GMThttp://www.shnenglu.com/geforcex/articles/1327.htmlhttp://www.shnenglu.com/geforcex/comments/1327.htmlhttp://www.shnenglu.com/geforcex/articles/1327.html#Feedback0http://www.shnenglu.com/geforcex/comments/commentRss/1327.htmlhttp://www.shnenglu.com/geforcex/services/trackbacks/1327.html阅读全文

geforceX 2005-11-25 22:19 发表评论
]]>
二叉树常用算?/title><link>http://www.shnenglu.com/geforcex/articles/1325.html</link><dc:creator>geforceX</dc:creator><author>geforceX</author><pubDate>Fri, 25 Nov 2005 12:20:00 GMT</pubDate><guid>http://www.shnenglu.com/geforcex/articles/1325.html</guid><wfw:comment>http://www.shnenglu.com/geforcex/comments/1325.html</wfw:comment><comments>http://www.shnenglu.com/geforcex/articles/1325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/geforcex/comments/commentRss/1325.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/geforcex/services/trackbacks/1325.html</trackback:ping><description><![CDATA[     摘要:   #include "stdio.h"#include "stdlib.h"typedef struct BiTNode{char data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;BiTree CreateBiTree(){char ch...  <a href='http://www.shnenglu.com/geforcex/articles/1325.html'>阅读全文</a><img src ="http://www.shnenglu.com/geforcex/aggbug/1325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/geforcex/" target="_blank">geforceX</a> 2005-11-25 20:20 <a href="http://www.shnenglu.com/geforcex/articles/1325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.n24657.cn" target="_blank">޹˾Ʒþþþþۺ</a>| <a href="http://www.linglonggegame.cn" target="_blank">þԭƷ</a>| <a href="http://www.oubaidu.cn" target="_blank">þþĻձ</a>| <a href="http://www.silkwormcup.cn" target="_blank">þþƷĻ</a>| <a href="http://www.d13722.cn" target="_blank">þþƷһպAV </a>| <a href="http://www.ccbaocheng.cn" target="_blank">پþþƷþ</a>| <a href="http://www.dongzhounews.cn" target="_blank">ĻۺϾþ2</a>| <a href="http://www.dyph.net.cn" target="_blank">һþ֪ۺϾþ</a>| <a href="http://www.aimingshi.cn" target="_blank">þþƷһ</a>| <a href="http://www.gocq8.cn" target="_blank">ɫݺݾþAVۺ</a>| <a href="http://www.r3665.cn" target="_blank">99þۺϺݺۺϾþ</a>| <a href="http://www.sgcx.net.cn" target="_blank">þþƷˮavۺ </a>| <a href="http://www.sztaoren.cn" target="_blank">þþƷƵ</a>| <a href="http://www.xqt007.cn" target="_blank">þ99Ʒ99þ6</a>| <a href="http://www.qhd33.cn" target="_blank">AVþþƷ</a>| <a href="http://www.essledyntp.com.cn" target="_blank">ҹƷþþþþþ</a>| <a href="http://www.yz10.cn" target="_blank">91޹˾þþƷ</a>| <a href="http://www.abcdds.cn" target="_blank">þԭƷ</a>| <a href="http://www.ssc992.cn" target="_blank">뾫Ʒþþþþ</a>| <a href="http://www.ybwsf.cn" target="_blank">˼˼þþƷ</a>| <a href="http://www.dr-knoell-consult.com.cn" target="_blank">պŮ18վþþƷ</a>| <a href="http://www.gvyf.cn" target="_blank">þۺϾƷһ </a>| <a href="http://www.fzdhqp.cn" target="_blank">˾þav</a>| <a href="http://www.dykh-tech.cn" target="_blank">69Ʒþþþ9999APGF</a>| <a href="http://www.digital-agri.org.cn" target="_blank">2021˾Ʒþ</a>| <a href="http://www.51567.cn" target="_blank">һþۺ³³ŷһ </a>| <a href="http://www.ktv025.cn" target="_blank">ƷþþþþþĻ</a>| <a href="http://www.oahk.cn" target="_blank">þ߿߿</a>| <a href="http://www.tkfh.net.cn" target="_blank">AVվþþƷ</a>| <a href="http://www.apramomall.cn" target="_blank">ĻþþƷ1</a>| <a href="http://www.shairproperty.cn" target="_blank">Ժձһձþ</a>| <a href="http://www.gsasv.cn" target="_blank">޷?Vþò</a>| <a href="http://www.huiju58.cn" target="_blank">AVþþþòվ</a>| <a href="http://www.ndtym.cn" target="_blank">þĻƵ</a>| <a href="http://www.ahozs.cn" target="_blank">ĻƷѾþ</a>| <a href="http://www.jisuxb.cn" target="_blank">þþƷav</a>| <a href="http://www.japjoy.cn" target="_blank">þó˾Ʒ</a>| <a href="http://www.woweikeji.cn" target="_blank">þþþһƷ</a>| <a href="http://www.bainiu168.cn" target="_blank">ƷþþþþӰԺ</a>| <a href="http://www.material7.cn" target="_blank">޹ƷAVþۺӰԺ</a>| <a href="http://www.wkbxdlr.cn" target="_blank">ۺպþóAV</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>