



版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2011年计算机等级考试二级C语言常见问题(1)第1章声明和初始化问题:我如何决定使用那种整数类型?64位机上的64位类型是什么样的?怎样定义和声明全局变量和函数最好?extern在函数声明中是什么意思?关键字auto到底有什么用途?我似乎不能成功定义ー个链表。我试过typedefstruct{char*item;NODEPTRnext;}*NODEPTR;但是编译器报了错误信息。难道在C语言中一个结构不能包含指向自己的指针吗?怎样建立相理解非常复杂的声明?例如定义ー个包含N个指向返回指向字符的指针的函数的指针的数组?函数只定义了一次,调用了一次,但编译器提示非法亜定义了。main()的正确定义是什么?voidmain()正确吗?对于没有初始化的变量的初始值可以作怎样的假定?如果一个全局变量初始值为“零”,它可否作为空指针或浮点零?代码intf(){chara[]="Hello,world!";)不能编译。这样的初始化有什么问题?char*p=malloc(lO);编译器提示“非法初始式‘‘云云。以下的初始化有什么区别?chara[]="stringliteral";char*p="stringliteral";当我向p[i]赋值的时候,我的程序崩溃了。我总算弄清除函数指针的声明方法了,但怎样才能初始化呢?第1章声明和初始化我如何决定使用那种整数类型?如果需要大数值(大于32,767或小于ー32,767),使用long型.否则,如果空间很重要(如有大数组或很多结构),使用short型.除此之外,就使用int型・如果严格定义的溢出特征很単要而负值无关紧要,或者你希望在操作二进制位和字节时避免符号扩展的问题,请使用对应的无符号类型。但是,要注意在表达式中混用有符号和无符号值的情况。尽管字符类型(尤其是无符号字符型)可以当成“小”整型使用,但由于不可预知的符号扩展和代码增大有时这样做可能得不偿失。使用无符号字符型有所帮助;类似的问题参见问题12.1.在选择浮点型和双精度浮点型时也有类似的权衡。但如果•个变量的指针必须为特定的类型时,以上规则不再适用.如果因为某种愫因你需要声明•个有严格大小的变质,确保象C99的<int-types.h>那样用某种适当的typedef封装这种选择。通常,这样做唯・的好原因足试图符合某种外部强加的存储方案,请参见同题20.3。如果你需要操作超过C的内置类型支持的超大变量,请参见问题!8.17.参考资料:[K<kRl,Sec.2.2p.34];[K&R2,Sec.2.2p.36,Sec.A4.2pp.195-6,Sec.Bllp.257];[ISO,Sec..1,Sec.6.125];[H&S,Secs.5.1,5.2pp.110-114].64位机上的64位类型是什么样的?C99标准定义了!onglong类型,其长度可以保证至少64位,这种类型在某些编译器上实现己经颇有时口了.其它的编译器则实现了类似」onglong的扩展。另ー方面,也可以实现16位的短整型、32位的整型和64位的长整型,有些编译器正是这样做的.参见问题!8.17.参考资料:[C9X,Sec..1,Sec.]怎样定义和声明全局变量和函数最好?首先,尽管个全局变量或函数可以(在多个编译单元中)有多处“声明”,但是“定义”却只能允许出现一次•定义是分配空间并赋初值(如果有)的声明.最好的安排是在某个相关的.c文件中定义,然后在头文件(.h)中进行外部声明,在需要使用的时候,只要包含对应的头文件即可。定义变量的.c文件也应该包含该头文件,以便编译器检査定义和声明的一致性.这条规则提供了髙度的可移植性:它和ANSIC标潴・致,同时也兼容大多数ANSI前的编译器和连接器.Unix编译器和连接器通常使用“通用模式”允许多車定义,只要保证最多对ー处进行初始化就可以了;ANSIC标准称这种行为为“公共扩展<',没有语带双关的意思.可以使用懂处理技巧来使类似DEFINE(int,1);的语句在ー个头文件中只出现一次,然后根据某个宏的设定在需要的时候转化成定义或声明。但不洁楚这样的麻烦是否值得.如果希望让编译器检査声明的一致性,一定要把全局声明放到头文件中・特别是,永远不要把外部函数的原型放到.C文件中:通常它与定义的一致性不能得到检査,而矛盾的原型比不用还槽桂。参见问题10.4和18.6.参考资料:[K&R1,Sec.4.5pp.76-7];[K&R2,Sec.4.4pp.80-1];[ISO,Sec.,Sec.6.7,Sec.6.7.2,Sec.G.5.11];[Rationale,Sec,];[H&S,Sec.4.8pp.101-104,Sec.9.2.3p.267];[CT&P,Sec.4.2pp.54-56].它可以用作・种格式上的提示表明函数的定义可能在另一个源文件中,但在externint1();和intf0;之间并没有实质的区别.参考资料:[ISO,Sec.6.1.2.2,Sec.6.5,1];[Rationale,Sec.3.1.2.2];[H&S,Secs..1pp.75-6].关键字auto到底有什么用途?亳无用途:它已经过时。参见问题20.32.参考资料:(K&R1,Sec.A8.1p.193];[ISO,Sec.,Sec.6.5.1;];[H&S,Sec.4.3p.75,Sec.4.3.1p.76].我似乎不能成功定义ー个鮭表°我试过ty]M'イ「f{char+it<iu:NODEPTRurxt:}"NODEPIR:但是编径器报了错误信目。难道在〇喏言中一个结构不能包含指冋自己的指针吗?C厝,屮口叫构节セnJ以包"#II由i:P&R2, 6.51]二沦卬例デ3;明了达デ,NODEPTR化:-的间匙[/[二?]next:戋的时バ(ypedef"设育ホムキ了解决这外网取・先Mアナ个拈构・。林《rstructnode")"]二,HWFext"或为-structnode或『I开typedef定义行”构定《.此・㈣吝/桑纳以ド上个修设后的成心structnode{char»ltem;structnode*next;);typedefstructnode♦NODEPTR;.少汪白‘种‘,"fI-的方リ.解,;、は1、リ親仁一typedef疋义"相弓!用的曲カ結构时也—とマ的同子,可以冃同徉的方法解决.冬见同虺2.1¥り资料:[K&R1.Sec.G.5p,101][K&R2.Sec.6.5p,139];[ISO.Sec.6.5.2,Sec6.523]:[H'S,Sec5.61pp.132-3]怎样建立和理解非常复杂的声明?例如定义ー个包含N个指向返回指向字符的指针的茁数的指针的数组?退个问ぐ至少有以ト3种右案:-char•(♦(aa[N])())();.用typedef菱し,;或声明:typedefchar*pc;/♦寸苻指针♦/typedeipcipc();ハヒけ苻指针的隕数*/rypedetfpc*pfpc;/» 而函数的指よ♦/typedefpipefpfpcO;/・返冋陋数描针的味数♦/typedeifpfpc♦pfptpc;ハル画数的指针♦/pfpfpca[N];/・ お指计的数组♦/.使用cdeclMア,它可K把英文翻译成C或并把C取译成贝文:cdecl>declareaasarrayofpointertofunctionreturningpointertofunctionreturningpointertocharchar♦(♦(♦a[])0)0通过类型转换,cdec!也可以用「解择复杂的声叨,指出t数应该进入哪•对括号(如同位!述的复杂函数定义Iり.一见何懸!81木好的C语言书都会解释如何“从内到外”解释和理解这样复杂的C语;声明(“模拟声明使用")。|二文的例子中的函数指针声明还没4包括参数类型信息。如果參数行复杂类型,声明就会变得真正的混乱了。现代的cdecl版木可以提供帮助.参考资料:[K&R2,Sec.5.12p.122];[ISO,Sec.6.5ff(esp.Sec.654)];[H助S,Sec.4.5pp.85-92.Sec.5.10.1pp.149-50]函数只定义了一次.调用了一次.但编译器提示非法重定义了。在范用内没行声明就调用(可能是第•次调用在函数的定义之前)的函数般认为返回整型(迎)(且没有任何参数类弐息),如果函数在后边声明或定义成其它类型就会导致矛盾.所。函数(非整型函数定変)必须在调用之前声明。另ー个可能的原因是该函数」某个头文件中声明的カ•个函数同名。参见问题11.4和15.1参考资料:[K&Rl,Sec.4.2p.70]:[K\rR2.Sec.4.2p.72];[ISO.Sec.G.3.2.2];[H&S,Sec.4.7p.101].inain()的正确定义是什么?voidinain()正确吗?参见问题!1.11到11.16.(这样的定义不正确).代码inff(){<li;n;»[]="H<llo.world!":}不能编译〇♦・依,E用的史ANSI之而的端ぐ国,小イ、匕手"as(automaticaggregates.miIIぬ态左ス;数如、/构和郎言)的例始化V见向庭11.28这样的初始化有什么问题?<h:ir・卩=inallo<(10):編怪器受示••非法初始式“云云。「,:」.’い「スナ,;」:,,,.一,“一 '.,'I.静志克斌)的树始式中以下的初始化有'什么区别?《hnr"°="stringIit«'ral":char+p="stringliteral":当我向p[i]赋值的时候.我的程序丽溃ア〇<'I-'1-I!,l< 「川衆河”’歩さ「小,”chara。!;中),它指明该数组I「『パ的何始值其它怙,兄ド,ピ会转化为卜无名的的.*7.「「「ー’;工,ミレンユ・_iL屮,数组邇常被;,间转化为1、指针("见第G韋),内ル决や亡此三p初始化成指向无名数的21、市4\为r竭-in代码.ズ的編译ーム —t一3可可的卄イ・见间题1」1、6.1、6.2K16.6.”.:t-v:rl[K<!cR2,Sec55p104]:[ISO.Sec.G.l4.Sec.6.5,7].[Rationale.See.3.14]:[H&S,Sec.2.7.4pp31-2]201I年计算机等级考试二级C语言常见问题(2)第2章结构、联合和枚举问题列表声明structxl{...};和typedefstruct{...}x2;有什么不同?为什么structx{...);xthestruct:不对?ー个结构可以包含指向自己的指针吗?在C语言中实现抽象数据类型什么方法最好?在C中是否有模拟继承等面向对象程序设计特性的好方法?我遇到这样声明结构的代码:structname{intnamelen;charnamestr[l];}:然后又使用ー些内存分配技巧使namestr数组用起来好像有多个元素。这样合法和可移植吗?是否有自动比较结构的方法?如何向接受结构参数的函数传入常数值?怎样从/向数据文件读/写结构?我的编译器在结构中留卜了空洞,这导致空间浪费而且无法与外部数据文件进行’‘二进制”读写。能否关掉填充,或者控制结构域的对齐方式?为什么sizeof返回的值大于结构的期望值,是不是尾部有填充?如何确定域在结构中的字节偏移?怎样在运行时用名字访问结构中的域?程序运行正确,但退出时却“coredump"了,怎么回事?可以初始化ー个联合吗?枚举和一组预处理的#define有什么不同?有什么容易的显示枚举值符号的方法?结构、联合和枚举声明structxl{...}:和typc<k,fstruct.{...}x2:有什么不同?■ ,ゝ<|i'=J」リ.を,,<”1,If•-7:セゼI股的区别と住后ス屮你掲要用“structxl”引用说朴,同比“x2”引川冷れ.也就セ说,第种声明更像种抽象类新一用户不必知道它是外结构,实例/也イ需般使用structよ.说]为什么structx{...};xthostnut:不对?C"C++ 1'. ' !」.一I」,,ム2」ー个结构可以包含指向自己的指针吗?»%nf以•与见河区LU在C语言中実现抽象数据类型什么方法最好?・•♦!使用闻二T4公卄定((也汴还隠藏在类型定ズかめ)ホ品构・ア:.•-ケ好办法 ;セイ、;デリ站构成员,声咽和使用缱名”结构指杆(不构类型指针)足.’泣的.达也止使用抽拿数国类型的原因.在C中是否有模拟继承等面向对象程序设计特性的好方法?把函数指针直接加入到结构中就可以实现简单的“方法”.你可以使用各种不雅而暴力的方法来实现继承,例如通过预处理器或含有“基类”的结构作为开始的子集,但这些方法都不完美•很明显,也没有运算符的重载和国盖(例如,“导出类”中的“方法”),那些必须人工去做。显然的,如果你需要“真”的面向对象的程序设计,你繡要使用ー个支持这些特性的语言,例如C++。我遇到这样声明结构的代码:structname{infnainekn:charnaiiH'sh[l]:}:然后又使用一些内存分配技巧使naiiicbtr数蛆用起来好像有多个元素,这样合法和可移植吗?这种技ギ十分讲尚,尽斡DennisRitchie称之为“知C’实现的无保:E的亲密拉:.,的餅杯认定它没行严格遵守C标准.尽论它。朱従所有的实现中都可以工作。仔细口で数组边界的编译器可能会发出警].ガ种可能一把变长的元家声明为很大,而イ、是很小;在I一中:charnamestr[MAXSIZE];MAXSIZE比・何可隹存储的name值都大・伊止,セ科技术似乎也イ、一全河合标准的严格解狎.这些啧ナ结构郡必双小心使用,因为只仃样字员知道它的大小,而里厚芻却无所知.<799「、「••一・ Ir■ ,类似间迎限供T个同酒的解決方案なワ德利:[Rationale.Sec35.4.2];[C9X.Sec.6.5.2,1]是否有自动比较结构的方法?没目.编译緡没有用単的“办法实现常ド卄メ<:「し:"Jレ!==. ,.这也符合C的低な特件简単的按字节比发会由」站构中没田M到的“空河”Q的随机数据(蒙见同«82.10)j失败;而按域比较在处理大结构时需腹难以接大病中旦代码.如果你需要比较两个结构,你必涙I!ノ写函数按壊比较.个い;?料“K&R2,Sec.G.2p.129];[Rationale.Sec.3.39];[HES,Sec5.6.2p.133].怎样从/向数据文件读/写结构?H^rite()\ifキ构相对简単:fwrite(fisomestruct,sizeofsomestruct,i,tp);rfrr;Mln UI,..:|*< . • I• •見十题2.1。和20.3)....i.い构包a何指针,则只有指针值会被写入文件,当它打円次读冋来的时候,彼a險巳後失效破広,为ア泛的移植.你必须用ザ标金加卄工件:づ见间则I2.30弗加n更好的方案上写对乐数.用可核粒(nffis.至・人爪・)的方式按.立与詁构.尽む开始可能L作市布大.・1•f[HトエSec.15.13p381]我的编径器在结构u留下ア空洞.这导致空间浪费而且无法与外部致提文件进行”ニ走制“读写C能否关掉填元.或者控制结构域的对齐方式?は些”交那寥ザ踴蟋頰滌炳冊中后面的城的对市垃也许必必I.J';ff..LJ;lI..1. ■' ,-I. '' 1l.JIM-1「cha!的美里)イ、胜处」点的内住:也加,而必3il£2或4或对仅大小的倍数,'.I1'. 一扩展用I,ゴ“,卜I-f住一样pragma;-121).。ごセムI小曲的カ法.・见诃,巴20.3,.ヤ.:;M[K<kR2,SecG4p138];[HirS.Sec5.6.4p.135]为什么ヽiz。げ返回的值大于结构的期望值.是不是尾部有填充?为「7仮分加江毎・ヨリ”ー效组トハ峋对齐,浩构可虎口必い述刘川充即使,.,一 ',,[也,F]レ.加,siz,",t,「ソ1iゴ ,いトI诃即2.10久;匕テf[H\S.See.5.67pp139-40]如何词定域在结构中的字节僞移?ANSIC<L<stddef.h>中定义j"ofisetofOT,用otfeetof(structs.f)可以计.it结构s中的偏移国如果出r某种原岡你需要门丄实现这个功屹可以使用下达这样的代码:^defineoffsetof(type,I)((size,)\((char♦)&((type*)0)->f-(char*)(type*)0))i<种实现イ、ー100%的可秽植;发些编译器可能会合法地拒地拉,受’ネ弓、:,[ISO,Sec7.1.6];[Rationale,Sec3.5.42],[HkS.Sec11.1pp292-3]201I年计算机等级考试二级C语言常见问题⑶问题列表:为什么这样的代码:a[i]=i++:不能工作?使用我的编译器,下面的代码inti=7;printf("%d\n",i++*i++);返回49?不管按什么顺序计算,难道不该打印出56吗?对于代码inti=3;i=i++;不同编译器给出不同的结果,有的为3,有的为4,哪个是正确的?这是个巧妙的表达式:a.=b.=a.=b它不需要临时变量就可以交换a和b的值。我可否用括号来强制执行我所需要的计算顺序?可是&&和II运算符呢?我怎样才能理解复杂表达式?“序列点’’是什么?那么,对于a国=i++;我们不知道a口的哪ー个分量会被改写,但i的确会增加I,对吗?++i和i++有什么区别?如果我不使用表达式的值,我应该用++i或i++来自增ー个变量吗?为什么如下的代码inta=100,b=100;longintc=a*b;不能工作?我需要根据条件把ー个复杂的表达式赋值给两个变量中的ー个。201I年计算机等级考试二级C语言常见问题(4)第4章指针问题列表:我想声明-"个指针并为它分配・些空间,但却不行。这些代码有什么问题?char*p;*p=malloc(lO);*p++自增p还是p所指向的变量?我有一个char・型指针正巧指向ー些int型变量,我想跳过它们。为什么如下的代码((int*)p)++;不行?我有个函数,它应该接受并初始化一个指针voidf(int*ip){staticintdummy=5;ip=&dummy;}但是当我如下调用时:int*ip;f(ip);调用者的指针却没有任何变化。我能否用void**指针作为参数,使函数按引用接受一般指针?我有一个函数externintf(int*):它接受指向int型的指针。我怎样用引用方式传入一个常数?C有“按引用传递”吗?我看到了用指针调用函数的不同语法形式。到底怎么冋事?我怎样把ー个int变量转换为char・型?为什么这样的代码:;巾]=i++:不能工作?千表达式耳十有tJ 一七・2改变i的值-bj7在同表达式的其它心ウセ引用,i4公け政无定义的"セ无从カ」:M弓Iリ1(イ边ギa[i]|').ZIflfn坯是新値(注意,尽智・任K&R中建议这类と达式的行为イ、确定,但C标准却强烈声明它上无定义的,あ见»,网11.32リ匕市朽:[KArRl.Sec2.12];[K^R2,Sec.212];[ISO.Sec.6.3];[H&S,Sec.7.12pp.227-9],使用我的埸译器.下面的代码inti=7:printf(i++*i++):返回网?不管按什么顺序计算.奉道不该打印出56吗?‘,「,じ,」「…11;;++!:1- .一"イ''' .■:,没有IHitJ, : .iuK!对友达式的其它部分进行计算之前〈即世行,也不能保i止变吊的更新会在去达式“完成”(按照ANSIC的术语,在ド个“Jt列点”之前,ぐ见何题3.7)之加的某个时刻逬厅.1例中,编译器选择使用变・的旧值相乘以后再对二十进行门增运算.包含多个不确定的副作用的代码的行为总是被认为未定义.(简单而言,“多个不确定副作用”是指在同一个表达式中使用导致同一对象修改两次或修改以后又被引用的自增,自减和赋值操作符的任何组合.这是•个粗略的定义;严格的定义»见问题3.7,“未定义”的含义参见问题11.32。)甚至都不要试图探窕这些东西在你的编译器中是如何实现的(这与许多C教科书上的弱智练习正好相反);正如K&R明智地指出,“如果你不知道它们在不同的机器上如何实现,这样的无知可能恰恰会有助于保护你。”参考资料:[K&R1,Sec.2.12p.50];[K&R2,Sec.2.12p.54];[ISO,Sec.6.3];[H&S,Sec.7.12pp.227-9];[CT&P,Sec.3.7p,47];[PCS,Sec,9.5pp.120-1].对于代码infi=3:i=i++:不同编译器给出不同的结果.有的カ3.有的为4.哪个是正确的?没有」-答案:这个友达式无定义,參见问題3.1,3.7和11.32«同时注意,i++和++i部イ、同17+1如果你要使i门増1,使用i=i+l.i+=l.i++或++i.HiHI仃何组公,梦见同感3.10这是个巧妙的表达式:a=b=a=b它不需要临时变量就可以交换a和b的值。这不具有可移植性・它H图任序例.巨之间两次修改变51%而这是无定义的.例如ぶ人报と如ド代码:inta=123,b=7654;在SCO优化C编译将(ice)卜会把b置为123.把a.为0.参见问即3.1,3.7和20.14.我可否用括号来强制执行我所需要的廿算顺序?•米ー・不行.运一苻优先级和括弧只能赋ア衣达是计算部分的顺序.在处ド的代码中1()+g()♦h()尽管我们知道乘法运算在加法之前,仲达井イ、或迎マスノ、闲数啷个会被首先调用.如果你后公桶保千な达人的什6m人你可花而收使用训姉的怖H史,和独在的済句.―用耍同:[KkRl.Sec.2.12p.49,SeeA7p];[K&R2,Sec2.12pp.52-3.Sec.A.7p.200.].可是&&和I!运算符呢?我看到过类似while((ぐ=getchar())!=EOF&&<!=へ1/)的代码 这些运算符在此处。・个特蛛的•<知路、例外:如果左边的づ表达大决定网络I<ノJII和蝕于&亚)则右边的子我达式不会计算因此,从左至《的计"可以确保,对过号ぜ州式也是如此.而且,所有这些运算符(包括?:)都会弓へ个物外的内部序例点(参见问题3.7).书号ー料:[K&R1,Sec.2.6p.38.Sees.A7.11-12pp.190-1];[K&R2,Sec.2.6p.41.Secs.A7.14-15pp.207-8];[ISO,.See6.3.13.Sec.6.3.14.Sec.6.3.15];[H&S,See.7.7pp217-8.Sec.7.8pp.218-20,Sec.7.12.1p.229];[CTicP.Sec.3.7pp.46-7]我怎样才能理解复杂表达式?•・序列点”是什么?户列由及卜时间点(在第个表达式仝部计リ完や之后或任II、パ卜、?:成,, 1l<I,H' ■_,' 'IANSI/ISOC标准这样描述:<£!个和ド个序列点之间,•个对案所保存的值至名只废被改达式的计算修改次而HWカ值只俄用「决定将要保存的值.第一句M比较费解.它说住个衣达式中如果策个对象而セ写入,则在同ん达式中对该对女的访问应该只局限「れ接用「•计算将要写入的侑这糸规则ん诡确保在修改之的オ访问变量的衰达式为合法,例如i=i+i介ド..;]a[i]=i++Wス1ノ.(,;见リ虺3.1)蓼见ド过的同题3.&芍ヮ诔科:[ISO,Sec,.Sec.6.3,Sec.6.6.AnnexC];[Rationale.See.2.12.3]:[H1fcs.See712.1pp228-9]那么.对于a[i]=i++:我们不知道n[]的哪ー个ガ量会被改写.但i的确会増加!.对吗?イー定[如果个&达式和一ー变存未定义,则它的所有方面都会变成人定义,参见问题3.2,3.3,11.32fD11.35.++i和i++有什么区别?如果你的C谙ri-没有说明它们的区别,那么买.灯的荷.而二:++iI.1-, 川任用它的我达式“返冋”新的.増加后的值;而i++对i增加,但返冋原來的足本增加的值.如里我不使用表达式的值.我应该用++i或i++来自增ー个変量吗?由r・一两种格式区别仪在川成的值,所以在仅使用它"I的副作用时,r±样.但工.在C++中,前缀方式却是首选.,・见问即3.3.为什么如下的代码infa=100.I>=100:k”用int<•=a*1>:不能工作?根据C的内部类型转换规则,乘法足用int进行的,而其结果可能在转换为I,“ほ:駅片ム边的c之前溢出或被破用.可以使用明确的英军话拉.强れ乗;丿.以long里进行:longintc=(longlnt)a♦b;注.©.,(longinり(a*b)不能达到需要的效果..当两个整数做除法一结・賦リ个一点变俗」,也行H能白同!(哭璽的何題,解决方法也让类似的’ゝU资料:[K&RLScc.2.7p,41];[KicR2.Sec.2.7p.44].[ISO.Sec];陋S,使用我的编辑器,ド口的代码];[CT&P,Sec.3.9pp49-50]我需要根据条件把ー个复杂的表达式赋值给两个变量中的ー个0可以用下边这样的代码吗?((condition)1!a:b)=conipli-catctLexprobh>n:一、/ .:• ii.iiMfi.in, 也..•:能生成卜“,f伍”.如果你れ的霰要.丨丨!I:I |代码♦((condition)?£a:&b)=compllcated_expresslon;尽管这亳无忧林可£.なサ资料:[ISO.See.63.15];[H&S,Sec.7.1pp.179-180]201I年计算机等级考试二级C语言常见问题(4)第4章指针问题列表:我想声明一个指针并为它分配ー些空间,但却不行。这些代码有什么问题?char*p;*p=malloc(lO);*p++自增p还是p所指向的变量?我有一个char・型指针正巧指向ー些int型变量,我想跳过它们。为什么如ド的代码((int*)p)++;不行?我有个函数,它应该接受并初始化一•个指针voidf(int*ip){staticintdummy=5;ip=&dummy;)但是当我如下调用时:int*ip;f(ip);调用者的指针却没有任何变化。我能否用void*・指针作为参数,使函数按引用接受一般指针?我有一个函数externintf(int*);它接受指向int型的指针。我怎样用引用方式传入一个常数?C有“按引用传递”吗?我看到了用指针调用函数的不同语法形式。到底怎么回事?我怎样把ー个int变量转换为char・型?指针我想声明一个指针并为它分配ー些空间.但却不行。这些代码有什么问题?ch;ir*p:*|»=iualloc(10):你一声明的指针让p.iiijイ;:Lp,当你操作指针本牙时(例如当你对其M值,使之指向别处时%你只露要使用指针的名字即可:p=malloc(10);ー你找用指针指向的内俘・你4需豊使用・作为间接操作符:♦p=H;参ー问题!.7,7.1,7.5和8.3.挈ヮ耍セ[CT&P.Sec3.1p28]*p++自增卩还是卩所指向的变量?一:.++,1—打。I' '"ソ11カれ先级品.因此*p++和・リ,++「ノー3p二冋pi地と血所指向的值,変门増p指向的值•使用ドp卄+,如果劭作用的川ib无关紧変也可以使用++*p,參サ日料:[KArRl.Sec.5.1p.91];[K&R2,Sec5.1p.95];[ISO.Sec.6.3.2.Sec.63.3];[HNS,Sec7.4.4pp.192-3.Sec.7.5p193.Secs.7.57,7.5.8pp199-200].我有一个char・型指针正巧指向ー些int型变量.我想跳过它们。为什么如下的代码((iut*)1>)++:不行?C「山,•」 ". . 1「リ,叶::巴」)»1:时・整生个转换按作符.根据定ス它只倨‘I成トム值(rvalue) 右值氏1-赋值.也不能用/白増(如果编译霽支持这样的扩展,那要么是个么足有意作出的科标准扩展.)要达到你的目的可以用:p=(char♦)((int*)p+1);或者,因为p是char・型.直接用p+=sizeof(int);伸足,在可能的情况ド.你「」1士代せ当的指针类里,而不足味地成權李代桃價Vワ资料[K&R2.Sec.A7.5p.205];[ISO.Sec,6.34];[Rationale,Sec.J[HA:S,Sec.71pp.179-80]我有个函数.它应该接受并初始化一个指针voidf(int*ip)[staticintdiiininy=5:ip=jcdinniny:}但是当我如下调用时:int*ip:f(ip):调用者的指针却没有任何变化。・ー函数初始化的是你希里它初始化 ' -: •C< .I过值传递的被调函数仅仅修改了传人的指什副本你所要传入指针的戈'数变成接受指计的指针),域お(•图数返冋指针.参见问题ユ5和17.我能否用void**指针作为参数.使函数按引用接受一般指针?一叫移司•c中没有股的指针的指计类型void・可以用作股指针只;因为当它和其它类型相m除值的时候,如果而要,它可以ウ动转换成其它类<;0!イI知自徉的换.所指类型为void・之外的类型的void*・指包吗,这个,换下能完成・我有一个函数。Xtcciii>tf(hit*):它接受指向int型的指针。我怎样用引用方式传入ー个常数?下面这样的调用f(&5):似乎不行。在C99中.你可以便用,戈公常ST:f((lntD){5B;•i I.' ' ,l(i'Li11.址传给函数:Intfive=5;f(tfive);参见时题2.8.丄4Ki20.1C有“按引用传递“吗?真的没有.严格地讲,c总C按值传递,你可以口に口拟按引用传递.定义接受指针的俅:数,然后在调用时使用&操作符・学实I,当你同由数传入数组(传入指ft的情况參见同題6.4及其它)対.潴渾器"丽I就入住粮拟按引用传递.但世C没有任何I!氏的按引用传递或C++的弓用/数的东西I:.•I•预处玛な4以巩供种“按名称心递”的形式.・见问«84.4和20」.・考资料:[K&R1.Sec.1.8pp.24-5,Sec.5.2pp.91-3]JK&R2,Sec1.8pp27-8.Sec.5.2pp.95-7]:[ISO.Sec.6.322]:[H&S,Sec.9.5pp.273-4]我看到了用指针调用函数的不同语法形式°到底怎么回事?最初,个函效指针心涉用*操作符(和对额外的括弧)“转换为”・个”真正的”函数才能调用:intr,funcO,(*ip)〇=func;r=(*fp)();ナ函数总是通过指针进行一用的,! 丁,二’「ー」「 iiful1,I '.It■iin:I .fp函数名和函数的指针r=fp();ANSIC标冲文师I接受ム山的解fれ达总J:丨:,. 1允许・・见问题1.14学书・科:[K&Rl.See.5.12p116];[K^R2,See.5.11p120];[ISO,Sec.6.3.2^].[Rationale.Sec.3.3.2J];[H&S,Sec5.8p,147,Sec.74.3p.190]我怎样把一个int变量转换为<liar・型?我试了类型转换.但是不行。一取决「你希望做什么如果你的类型转换不成功,你可能是企图把整数转为了符串,这种情况参见问题131.S1果你试图把整数转换为字符.参见问题8.4如果你忒阳计个指针指向特定的内存地址,梦见问题19.29.201I年计算机等级考试二级C语言常见问题(5)第5章空(null)指针问题列表:5.!臭名昭著的空指针到底是什么?怎样在程序里获得一个空指针?用缩写的指针比较“if(p)”检查空指针是否可靠?如果空指针的内部表达不是〇会怎么样?NULL是什么,它是怎么定义的?在使用非全零作为空指针内部表达的机器上,NULL是如何定义的?如果NULL定义成#defineNULL((char*)0)难道不就可以向函数传入不加转换的NULL了吗?如果NULL和〇作为空指针常数是等价的,那我到底该用哪ー个呢?但是如果NULL的值改变了,比如在使用非零内部空指针的机器卜.,难道用NULL(而不是。)不是更好吗?用预定义宏#defineNullptr(type)(type*)0帮助创建正确类型的空指针。这有点奇怪。NULL可以确保是〇,但空(null)指针却不一定?为什么有那么多关于空指针的疑惑?为什么这些问题如此经常地出现?我很困惑。我就是不能理解这些空指针・类的东西。考虑到有关空指针的所有这些困惑,难道把要求它们内部表达都必须为〇不是更简单吗?说真的,真有机器用非零空指针吗,或者不同类型用不同的表达?运行时的“空指针赋值”错误是什么意思?空(null)指针臭名昭著的空指针到底是什么?语;,定义中说叨,每种指计类里酣有个特殊值——“空指针”——它。同类型的其它所有指针值都不相同,它-与任何对象或函数的指针值都不相等“也就足说・取地址被作符&永州也不能得到空指针,同H对maUoc()的成功调用也イ、会返问空指针,如果失败,maUoc()的确返冋空指计」小と::・指针的鼎里用法:衣示“イ、分陀”或者“尚未指向任何地方”的指,匕空指针在极念I不同广卡初始化的指针空指针可以蝶仟イ;指向任何对案或・ , : I可能指向任何崎、参见问题L10、7.1和7.26加卜・文所述,毎种指针一一都有ト空指针,而
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重型机械融资租赁合同书草案
- 乡镇小冷库出租合同标准文本
- 劳动教育中国学
- 婚前协议:孕妇打胎与离婚合同
- 供销钢材合同标准文本
- 中型载客汽车租赁合同标准文本
- 大学生创业指导说课
- 公用商业装修合同标准文本
- 英文合作协议合同范本
- 中餐饭店转让合同范例
- 沪科版八年级数学下册第十七章《一元二次方程》单元测试及答案
- 设备维护保养
- 图像傅里叶变换教学课件
- 学生课余生活调查报告
- 前帮机操作规程
- 无人机导航与通信技术PPT完整全套教学课件
- 克罗恩病-课件
- 露天煤矿标准化PPT培训课件
- T-JCCFS 0004-2023 晋城市银行营业网点适老服务要求
- 导游英语口语完整全套教学课件
- 南京大学-大学计算机信息技术教程-指导书
评论
0/150
提交评论