|
今天阅读《C/C++程序员面试指南》中指针一块,以前一知半解的指针问题顷刻间懂了。6 }' i3 C9 T; T( b, N; N+ o5 u : j. e1 Q7 z' D0 N8 ]: U 下面,可以做个测试,如果下面的指针问题你能够全都解答正确,那么你的C语言功底真是神一般的了。8 u @/ L) r" }* u6 L$ L 1.int *p; # ], B6 S: g2 C5 B0 i) a l 2.int **p; 3.int *p[10];* M* a$ z; l& @( S4 } 4.int (*p)[10];5 S4 x6 g2 w {2 T9 Q7 d3 h4 ? 5.int *p(int);/ r7 z/ a; J6 u, V" h( v 6.int (*p)(int);2 a: N) c6 m3 W5 h 7.int (*p[10])(int);0 o- {1 x( \0 a5 \3 K% M; y2 v5 q) W * S. ~) [$ ]* J8 Y9 `) p 这七个难度还不是很大,相信大多数读者都能够答的出来。 答案: 3 e: a: I' h7 k( u8 s" i2 Z; { 1.一个指向整型数据的指针' {/ U5 u K8 [' _+ [9 Y0 Q! \ , X; O% u* `, W5 L4 ~ 2.一个指针的指针,它指向的指针指向一个整型数据 7 ?2 s6 _( ^+ T 3.一个有十个指针的数组,该指针指向整型数据 1 o: H) _5 a5 }! x: a 4.一个指向有十个整型数据数组的指针 5.就一个函数(不是函数指针),该函数有一个整型参数,返回值为一个指向整型的指针3 g: t* z0 Z j 6.一个函数指针,该函数有一个整型的参数,返回值为整型类型 % z1 k2 C" K) t) Q/ N4 G( i! e# I# k5 t 7.一个有十个指针的数组,该数组中的指针指向一个函数,该函数有一个整型参数并返回一个整型数4 D$ f, U! _, r4 M5 S9 c : l3 u1 x# p7 W6 s4 {8 X R+ h 啊,当时看完我就吁了口气,真神一般似的,但是但我接着看下去,下面有碰到一个,我彻底崩溃了....... & q: G: A' ?" I- @: E7 b S 题目是这样的: 请解析 (*(void (*)())0)() 的含义。// 怎么样?要HOLD住阿! 分析问题:+ p) h. O4 N' M8 F& r; h$ C- v/ G 不卖关子了,但是我早HOLD不住了。书中的答案是这样的,* ]2 y o# l8 T$ s 有些微处理器从0地址启动,有时为了模拟开机时的情形,需要设计一条C 语句,去执行0地址的内容,于是就有了(*(void (*)())0)() 这条语句。6 S( Q# j" q- x, N9 x- y* v 这条语句一眼看上去让人头疼,但分析之后还是挺简单的。# }/ J6 K. V+ \) r1 s# x 首先,当有如下函数声明时:. `+ }9 z' K3 W! T3 U ) g8 e( c; t ^1 ~ void fun(param);& x3 L- ~/ f; v+ p 9 ]( r4 U3 N# {; L; c% k. k 这个函数的调用形式为:fun(param); % G. k& y, j+ E/ C9 j3 C" Y# I 题目的函数没有参数,所以就简化成fun(); 而0是这个函数的入口地址,即0就是这个函数的指针值,指针的函数声明为: void (*pFun)(param);' _ D( }! ]% O* d% o' t: B+ s- M 调用形式为:(*pFun)(param); ! P7 `$ f% I; e 对于本题可以写成:( *0 ) ();' k5 ^# x f3 E8 j3 A, F1 Q4 b6 c# X - r1 h# @: D$ ?( q. ~. x 但是函数指针变量不能是个常数,所以还要把0强制转换成函数指针,根据原题可以元函数的函数指针原型为 void (*)();& s) d! G' }& `4 ^6 ^" L 0 w0 I) `* \& I, N* k8 O0 n 于是(*(void (*)())0)()可以这样来分析,首先用void (*)()把0强制转换成了函数指针,然后再调用函数指针0所指向的函数。 可以用typedef来加深对本句的理解,如下: typedef void (*pFun)();/ _% w: k; A* Z5 { ((*pFun)0)();. e- J% ]# P5 N" @' s0 M3 @ % ~9 f$ ~9 x1 S 这两句和(*(void (*)())0)()是等价的,但是这样更有助于加深对本句的理解。 8 ~3 J& n2 q' U% G 总结:(*(void (*)())0)()就是 *(void (*)())0 所对应的函数的调用。 9 I, y. p2 y1 b2 W0 Y3 B 神一般的C语言指针.....希望对大家掌握指针有所帮助(*^__^*) / L0 T5 _; `0 q* z ----------------------------------------------------------------------↓↓↓↓↓此位置↓↓↓↓求收藏↓↓↓求支持↓↓↓↓↓& s5 } \' w+ a( B& b |
微信公众号
手机版
我觉得指针是C语言独特之处。
我也是从网上复制来的,分享一下
谢谢回复
数码宝贝,又看到你了