
今天阅读《C/C++程序员面试指南》中指针一块,以前一知半解的指针问题顷刻间懂了。4 {2 s% X9 v* S f7 U / W; `3 C3 {$ P 下面,可以做个测试,如果下面的指针问题你能够全都解答正确,那么你的C语言功底真是神一般的了。 1.int *p; 2.int **p; 3.int *p[10]; }0 f/ Q1 K6 S 4.int (*p)[10]; ( X! z) `- W J M# Y& B 5.int *p(int); 0 {4 M P3 a) b. Y# z 6.int (*p)(int); 6 A% ^6 w& d. x1 n: u& d* z) A, ` 7.int (*p[10])(int); 7 w% d2 m% N* E' H+ T; ^ 这七个难度还不是很大,相信大多数读者都能够答的出来。 答案:( ]1 E" ]! L+ u9 `( d7 R) Z, t# s 6 m- q7 r! d% B, E' y5 b. s/ L 1.一个指向整型数据的指针: N0 R3 t% s& i& Q1 \" w+ j 9 c- o6 G5 B# }* D 2.一个指针的指针,它指向的指针指向一个整型数据7 I+ C+ [" W; |& n3 ~, a 0 o$ \* f8 z$ R3 M 3.一个有十个指针的数组,该指针指向整型数据 4.一个指向有十个整型数据数组的指针- w. j; Y: j5 w% V, Y3 w 5.就一个函数(不是函数指针),该函数有一个整型参数,返回值为一个指向整型的指针 ' X/ l8 C/ e. h, j1 U3 x1 a 6.一个函数指针,该函数有一个整型的参数,返回值为整型类型: m# \, J& Z- X1 H2 P6 T* Z8 F " q+ W( N( b9 D# {8 y 7.一个有十个指针的数组,该数组中的指针指向一个函数,该函数有一个整型参数并返回一个整型数 - X3 z% }3 Y% Q- q 啊,当时看完我就吁了口气,真神一般似的,但是但我接着看下去,下面有碰到一个,我彻底崩溃了....... 题目是这样的: / ^2 D% f6 a3 } 请解析 (*(void (*)())0)() 的含义。// 怎么样?要HOLD住阿!3 l# {3 c3 |, ^* M" y$ W: ~ \* x 分析问题:* Y* e2 l! s/ _2 ], o 不卖关子了,但是我早HOLD不住了。书中的答案是这样的," h: y6 M. h* J1 H / o1 D) {" R& @1 v: l- e, b 有些微处理器从0地址启动,有时为了模拟开机时的情形,需要设计一条C 语句,去执行0地址的内容,于是就有了(*(void (*)())0)() 这条语句。 这条语句一眼看上去让人头疼,但分析之后还是挺简单的。/ \5 ?/ p* c% b7 o+ y ' c' \; l% g' \ f, x 首先,当有如下函数声明时: void fun(param); , V, u1 T0 ~8 E# K& r 这个函数的调用形式为:fun(param);( _6 f. l/ P% F 题目的函数没有参数,所以就简化成fun(); ) H6 x5 j( w- V: n! _$ { 而0是这个函数的入口地址,即0就是这个函数的指针值,指针的函数声明为: B& {6 @% u( ?4 _; T- q void (*pFun)(param); 调用形式为:(*pFun)(param);9 K9 i8 @3 ]8 v3 ], d1 X1 v ( u6 A, b6 B( C$ W 对于本题可以写成:( *0 ) (); 2 w: j8 @/ v. g: I1 N 但是函数指针变量不能是个常数,所以还要把0强制转换成函数指针,根据原题可以元函数的函数指针原型为 void (*)();: l% r# e) y. H' z 于是(*(void (*)())0)()可以这样来分析,首先用void (*)()把0强制转换成了函数指针,然后再调用函数指针0所指向的函数。( | } n4 w# C$ }& u2 b / b! R4 E) w. Z! _. R% o; U+ M) G6 U ^) X 可以用typedef来加深对本句的理解,如下:1 p# ~5 T- {" P3 G1 [! }0 o typedef void (*pFun)(); 5 {! z& t$ `6 B ((*pFun)0)();( {; K% N1 Y; w6 o) H. P- p, M ; S/ }7 u/ J# N1 U8 \: k) F5 W7 t, L 这两句和(*(void (*)())0)()是等价的,但是这样更有助于加深对本句的理解。" y5 W, r1 F( w0 A& V 9 @5 @5 y# }5 _! h 总结:(*(void (*)())0)()就是 *(void (*)())0 所对应的函数的调用。 * j8 ~5 I' T% v 4 @- m5 Z7 N) f0 H; b- Y5 D3 Z 神一般的C语言指针.....希望对大家掌握指针有所帮助(*^__^*) ----------------------------------------------------------------------↓↓↓↓↓此位置↓↓↓↓求收藏↓↓↓求支持↓↓↓↓↓9 w1 N0 G) P3 t' c. B: ~3 w |
我觉得指针是C语言独特之处。
我也是从网上复制来的,分享一下
谢谢回复
数码宝贝,又看到你了