你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

[肚肚分享]神一样的c指针  

[复制链接]
拉肚肚 发布时间:2015-9-6 14:48
今天阅读《C/C++程序员面试指南》中指针一块,以前一知半解的指针问题顷刻间懂了。
5 V* i; O1 s, h5 }: Z5 I" `2 G2 g5 s5 G0 s! P# S
下面,可以做个测试,如果下面的指针问题你能够全都解答正确,那么你的C语言功底真是神一般的了。
. K6 P. Q4 P! V+ S* z0 y! y) A7 _1 M: q$ Z; C! F5 q
1.int *p;
9 c( o  d9 x( \' L/ N6 [. u" k; u6 ~' K, ]5 O8 X2 U# t: Y
2.int **p;
9 I9 N$ Q8 l0 P$ a' ~8 b
/ i$ U) }' m4 `( S4 C* j- o3.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: `
这七个难度还不是很大,相信大多数读者都能够答的出来。
4 `5 [8 b& }: J
, N% I  r7 J) U) o& P. m答案:1 z/ z" f0 [6 \" W
! @8 o: d+ g( M' |; @
1.一个指向整型数据的指针
+ |/ r: r; ~' N3 l
1 e* e( E% r8 C, i( U/ S2.一个指针的指针,它指向的指针指向一个整型数据
9 i1 r3 L1 X6 _
8 P5 x7 E2 |% x$ x3.一个有十个指针的数组,该指针指向整型数据
6 J3 ]* F- h8 F
2 A7 m, Q9 y0 E4 k2 ~4.一个指向有十个整型数据数组的指针5 p2 A# ~4 H  Q/ P9 R

7 i3 Q0 g+ ?1 ?+ w# W* l# x5.就一个函数(不是函数指针),该函数有一个整型参数,返回值为一个指向整型的指针2 c* Z8 E" T! r6 F

( e1 h+ S0 L' T  K. Q5 W  i# J6.一个函数指针,该函数有一个整型的参数,返回值为整型类型& T! w4 o1 V$ M) q. _6 u& E# n

5 S% C  v; W8 p1 p2 _. [7.一个有十个指针的数组,该数组中的指针指向一个函数,该函数有一个整型参数并返回一个整型数
5 D! k1 D! U9 I1 U8 T: n2 Q; O5 B4 q. l: c/ V- a- J- r* q* E% Z
啊,当时看完我就吁了口气,真神一般似的,但是但我接着看下去,下面有碰到一个,我彻底崩溃了.......
: U4 S/ h1 \- T9 P3 n; m/ `8 M5 _. m. ]$ l. V

- x6 `. @2 r: U; \; V& L7 f! l, b0 J  l& f$ {. V' k# F1 D
题目是这样的:
7 J- G8 D& U6 v) g3 n
* K/ L6 ?  T7 V0 y- N8 f请解析 (*(void (*)())0)() 的含义。// 怎么样?要HOLD住阿!
( m) c( U7 {* l
) u+ M  Q7 E/ X6 c" ~分析问题:
9 P' h  l$ U* t5 D! `: M/ g/ J4 `
不卖关子了,但是我早HOLD不住了。书中的答案是这样的,2 n5 f1 D3 t- J9 {
; ^! {% J9 b& M/ }) x
有些微处理器从0地址启动,有时为了模拟开机时的情形,需要设计一条C 语句,去执行0地址的内容,于是就有了(*(void (*)())0)() 这条语句。
, H8 d, E3 ?* w6 M) }* a7 G. j$ Y1 J
  E" }$ `% Q; Y: s# H; s这条语句一眼看上去让人头疼,但分析之后还是挺简单的。
  i/ S9 w% Y7 c6 {6 i$ `7 `/ w. j0 f8 ]5 A- _; I% ]
首先,当有如下函数声明时:
. u3 d3 @0 h' s+ @' G% O
9 s5 S4 v* B" n4 L" svoid fun(param);; G7 q: S; B% b2 H9 J, {1 B7 u

+ m' R  G* ~; s* K这个函数的调用形式为:fun(param);, r2 m" V' v" E3 e1 L2 c* W" Z

% \8 Z8 n- v7 w" A1 U题目的函数没有参数,所以就简化成fun();
( A8 n& P4 w, S* j/ h; F7 K6 q) ]/ B" p
而0是这个函数的入口地址,即0就是这个函数的指针值,指针的函数声明为:
; K* k) Q/ G! Y) y8 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);
, ?: Q. K& k/ ~: {' p8 F: j3 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 (*)();
. p1 ?/ y' `* L8 P6 B
) K  A* H3 E0 a7 A于是(*(void (*)())0)()可以这样来分析,首先用void (*)()把0强制转换成了函数指针,然后再调用函数指针0所指向的函数。
$ O. S% w0 ~. _  M; 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)();
4 ^8 n; C( J$ @
) ^0 r; w/ }, Z, }8 v((*pFun)0)();
! B9 x; U. B; t/ {
7 S) F( M0 L- @- I9 E0 ]; v这两句和(*(void (*)())0)()是等价的,但是这样更有助于加深对本句的理解。
% n( ?: K1 |# e* n6 u! y
$ ?$ S  A: E6 i8 R+ O% p1 F总结:(*(void (*)())0)()就是 *(void (*)())0 所对应的函数的调用。
" }3 b( s5 Q6 K5 ~! D4 \1 J+ Y  z$ G: X( q) b$ x) F

- P. h" D8 W& o0 l7 q4 j; o7 n* l2 M( ]& p. H6 ?2 K5 Q5 W8 ]- _+ k
神一般的C语言指针.....希望对大家掌握指针有所帮助(*^__^*) * C& E4 F4 S, Y1 t: l- ]
----------------------------------------------------------------------↓↓↓↓↓此位置↓↓↓↓求收藏↓↓↓求支持↓↓↓↓↓! S1 u8 }3 y# ?& |5 K  [/ j
赞 收藏 6 评论30 发布时间:2015-9-6 14:48

举报

30个回答
拉肚肚 回答时间:2015-9-6 17:27:30
Inc_brza 发表于 2015-9-6 16:50' K- ~+ s$ F0 V) P
没啥神不神的,有基础,多复杂都不怕的,尽管是个柚子,把皮扒多几层,原型也就显露了!别神化这个指针,对 ...
/ f9 z3 e' G& ~, L; }8 \  H1 c
我觉得指针是C语言独特之处。
Inc_brza 回答时间:2015-9-6 16:50:40
没啥神不神的,有基础,多复杂都不怕的,尽管是个柚子,把皮扒多几层,原型也就显露了!别神化这个指针,对自己没多大用处。与其说他神,还不如把他征服,自己当神去吧!
拉肚肚 回答时间:2015-9-6 17:26:46
759611 发表于 2015-9-6 16:53% o- r! d; ]- w: A' n
我发现楼主最近发了不少好贴呀!
: c! q& R" _/ ^6 _
我也是从网上复制来的,分享一下
拉肚肚 回答时间:2015-9-6 14:48:49
占个沙发,求指点。
wyxy163@126.com 回答时间:2015-9-6 16:47:59
提示: 作者被禁止或删除 内容自动屏蔽
759611 回答时间:2015-9-6 16:53:34
我发现楼主最近发了不少好贴呀!
风子 回答时间:2015-9-6 16:56:26
哦,也就是些基础,谢谢分享
拉肚肚 回答时间:2015-9-6 17:27:02
风子 发表于 2015-9-6 16:56
% D" @$ M2 @6 ~$ N) u( q0 G哦,也就是些基础,谢谢分享
5 K7 w0 |- L& j0 O4 @2 J) w
谢谢回复
拉肚肚 回答时间:2015-9-6 17:27:45
5 I9 f/ r! \% @
数码宝贝,又看到你了
mark0668 回答时间:2015-9-6 21:42:56
神一样的妙用。
wyxy163@126.com 回答时间:2015-9-7 07:55:21
提示: 作者被禁止或删除 内容自动屏蔽
yanhaijian 回答时间:2015-9-7 08:22:58
面试总会遇到这种问题。
小小超 回答时间:2015-9-7 08:51:06
谢谢分享~~
Tension 回答时间:2015-9-7 09:59:39
有很多已经记不清了,不过多数是理论大于实用。
123下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版