|
今天阅读《C/C++程序员面试指南》中指针一块,以前一知半解的指针问题顷刻间懂了。 5 I" `2 G2 g5 s5 G0 s! P# S 下面,可以做个测试,如果下面的指针问题你能够全都解答正确,那么你的C语言功底真是神一般的了。 7 _1 M: q$ Z; C! F5 q 1.int *p; . u" k; u6 ~' K, ]5 O8 X2 U# t: Y 2.int **p; 3.int *p[10];+ B! L7 Z" i" ]/ m1 d 4 b' ` |& X; y# K |6 S" r( }: T |% o 4.int (*p)[10];$ S! l5 n: _5 X0 I : y. k0 j0 U7 _! I. j& } O 5.int *p(int);( x! c# X. X$ e1 K. q! a4 u N! r k$ x5 ~ 6.int (*p)(int);0 K& O$ n& ^' \) J/ s ) W, O/ z0 N5 O& P 7.int (*p[10])(int);! H# O1 c& s7 J8 W P+ ~ 5 Z8 S& U4 M0 q5 o" ^+ m: ` 这七个难度还不是很大,相信大多数读者都能够答的出来。 答案:1 z/ z" f0 [6 \" W ! @8 o: d+ g( M' |; @ 1.一个指向整型数据的指针 2.一个指针的指针,它指向的指针指向一个整型数据 3.一个有十个指针的数组,该指针指向整型数据 4.一个指向有十个整型数据数组的指针5 p2 A# ~4 H Q/ P9 R 5.就一个函数(不是函数指针),该函数有一个整型参数,返回值为一个指向整型的指针2 c* Z8 E" T! r6 F 6.一个函数指针,该函数有一个整型的参数,返回值为整型类型& T! w4 o1 V$ M) q. _6 u& E# n 7.一个有十个指针的数组,该数组中的指针指向一个函数,该函数有一个整型参数并返回一个整型数 4 q. l: c/ V- a- J- r* q* E% Z 啊,当时看完我就吁了口气,真神一般似的,但是但我接着看下去,下面有碰到一个,我彻底崩溃了....... 5 _. m. ]$ l. V , b0 J l& f$ {. V' k# F1 D 题目是这样的: 请解析 (*(void (*)())0)() 的含义。// 怎么样?要HOLD住阿! 分析问题: 5 D! `: M/ g/ J4 ` 不卖关子了,但是我早HOLD不住了。书中的答案是这样的,2 n5 f1 D3 t- J9 { ; ^! {% J9 b& M/ }) x 有些微处理器从0地址启动,有时为了模拟开机时的情形,需要设计一条C 语句,去执行0地址的内容,于是就有了(*(void (*)())0)() 这条语句。 这条语句一眼看上去让人头疼,但分析之后还是挺简单的。 7 `/ w. j0 f8 ]5 A- _; I% ] 首先,当有如下函数声明时: void fun(param);; G7 q: S; B% b2 H9 J, {1 B7 u 这个函数的调用形式为:fun(param);, r2 m" V' v" E3 e1 L2 c* W" Z 题目的函数没有参数,所以就简化成fun(); * j/ h; F7 K6 q) ]/ B" p 而0是这个函数的入口地址,即0就是这个函数的指针值,指针的函数声明为: 8 w5 I$ D5 t- O void (*pFun)(param);9 B2 g) m* b% i. ?4 h) a$ x 6 ]% s, ~7 ~& b- f" [& ] 调用形式为:(*pFun)(param); 3 E- x" L9 ^5 j: R1 v: h3 [ 对于本题可以写成:( *0 ) ();0 N! a, E" |7 Z3 |3 M4 a# f6 z* N {! G S& Q' E, f: t& v9 D 但是函数指针变量不能是个常数,所以还要把0强制转换成函数指针,根据原题可以元函数的函数指针原型为 void (*)(); 于是(*(void (*)())0)()可以这样来分析,首先用void (*)()把0强制转换成了函数指针,然后再调用函数指针0所指向的函数。 ; w* N) w( C7 Y/ ?* ^/ i3 a 可以用typedef来加深对本句的理解,如下:* d0 J3 s) {" |+ h6 B1 t , x" ^. y; H, K& t; i4 ]1 ^$ q6 C4 @ typedef void (*pFun)(); ((*pFun)0)(); 这两句和(*(void (*)())0)()是等价的,但是这样更有助于加深对本句的理解。 总结:(*(void (*)())0)()就是 *(void (*)())0 所对应的函数的调用。 + Y z$ G: X( q) b$ x) F & p. H6 ?2 K5 Q5 W8 ]- _+ k 神一般的C语言指针.....希望对大家掌握指针有所帮助(*^__^*) * C& E4 F4 S, Y1 t: l- ] ----------------------------------------------------------------------↓↓↓↓↓此位置↓↓↓↓求收藏↓↓↓求支持↓↓↓↓↓! S1 u8 }3 y# ?& |5 K [/ j |
微信公众号
手机版
我觉得指针是C语言独特之处。
我也是从网上复制来的,分享一下
谢谢回复
数码宝贝,又看到你了