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

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

[复制链接]
拉肚肚 发布时间:2015-9-6 14:48
今天阅读《C/C++程序员面试指南》中指针一块,以前一知半解的指针问题顷刻间懂了。4 {2 s% X9 v* S  f7 U
/ W; `3 C3 {$ P
下面,可以做个测试,如果下面的指针问题你能够全都解答正确,那么你的C语言功底真是神一般的了。
5 }  x& u) d+ c, }# n. b# @
  i0 K; }* ]+ A- D1.int *p;
2 L! O  s; m' n. N6 e$ q
; S& w: F/ h9 }  I2.int **p;
0 Q: P. }8 D/ x7 l, R
) y& ]" Z3 l0 V2 \' R+ P! o3.int *p[10];
2 |" w, p: d4 b8 }  }0 f/ Q1 K6 S
4.int (*p)[10];
) P- b0 e( t6 G6 C/ \( X! z) `- W  J  M# Y& B
5.int *p(int);
( Y& Q: D1 `2 S3 E0 {4 M  P3 a) b. Y# z
6.int (*p)(int);
4 z" W+ p0 Y" O9 e0 p, Y9 d6 A% ^6 w& d. x1 n: u& d* z) A, `
7.int (*p[10])(int);
4 O6 z" C! X$ R: x3 H7 w% d2 m% N* E' H+ T; ^
这七个难度还不是很大,相信大多数读者都能够答的出来。
7 h% r: J1 A. R2 m9 x+ e* O
% W5 c; Q  Y4 ^. 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.一个有十个指针的数组,该指针指向整型数据
$ |7 s. ]# X% Q/ ?) O
! r+ O& D# N, B( r6 d+ ]* ?4.一个指向有十个整型数据数组的指针- w. j; Y: j5 w% V, Y3 w

" i; ]+ R% o% q& x/ o5.就一个函数(不是函数指针),该函数有一个整型参数,返回值为一个指向整型的指针
- v( m5 v7 R* d, @$ E' s- t' 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.一个有十个指针的数组,该数组中的指针指向一个函数,该函数有一个整型参数并返回一个整型数
9 q; a, U5 O( s+ V- X3 z% }3 Y% Q- q
啊,当时看完我就吁了口气,真神一般似的,但是但我接着看下去,下面有碰到一个,我彻底崩溃了.......
- T5 _6 q! x) F
$ d' [$ b0 F, y% T4 J
# ~8 B1 }* I% L( J3 b* T$ S
2 K" q  S1 c; C5 a5 ]题目是这样的:
# z; C4 \, ~( E! `1 J  T/ ^2 D% f6 a3 }
请解析 (*(void (*)())0)() 的含义。// 怎么样?要HOLD住阿!3 l# {3 c3 |, ^* M" y$ W: ~  \* x

  s' F, S! b) G- X分析问题:* Y* e2 l! s/ _2 ], o

. e. h: g, s- Q( A9 O, V; U2 p8 A  [" R不卖关子了,但是我早HOLD不住了。书中的答案是这样的," h: y6 M. h* J1 H
/ o1 D) {" R& @1 v: l- e, b
有些微处理器从0地址启动,有时为了模拟开机时的情形,需要设计一条C 语句,去执行0地址的内容,于是就有了(*(void (*)())0)() 这条语句。
- [/ H: Z* {5 |
8 q  i3 G# Q. b6 ~1 M( |0 b+ l这条语句一眼看上去让人头疼,但分析之后还是挺简单的。/ \5 ?/ p* c% b7 o+ y
' c' \; l% g' \  f, x
首先,当有如下函数声明时:
' N2 P  i6 _: m5 U1 d
8 X* n# |  |( J, k1 Wvoid fun(param);
3 U) Y, k( ]7 s' q- B( K/ C5 P0 A, V, u1 T0 ~8 E# K& r
这个函数的调用形式为:fun(param);( _6 f. l/ P% F

2 o) K% ~% p6 L5 U1 e' w题目的函数没有参数,所以就简化成fun();
9 k4 V( Q2 A4 K2 C) H6 x5 j( w- V: n! _$ {
而0是这个函数的入口地址,即0就是这个函数的指针值,指针的函数声明为:
: Q" y/ ~; H2 ?9 q8 A- F  B& {6 @% u( ?4 _; T- q
void (*pFun)(param);
0 P- ^% e: B' l" M3 J
; A% E9 j1 ?4 q' d调用形式为:(*pFun)(param);9 K9 i8 @3 ]8 v3 ], d1 X1 v
( u6 A, b6 B( C$ W
对于本题可以写成:( *0 ) ();
  L( u. n; c/ i) F2 w: j8 @/ v. g: I1 N
但是函数指针变量不能是个常数,所以还要把0强制转换成函数指针,根据原题可以元函数的函数指针原型为 void (*)();: l% r# e) y. H' z

' i- F( N/ G/ z3 x2 p; M于是(*(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

; T, x7 F1 g) P% X  W3 t. jtypedef void (*pFun)();
1 r6 t  g& e. W- {- v5 {! 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 所对应的函数的调用。
% g+ n2 V' D3 y, u; U. _, X# N
! M/ O5 h; E- l* j8 ~5 I' T% v
4 @- m5 Z7 N) f0 H; b- Y5 D3 Z
神一般的C语言指针.....希望对大家掌握指针有所帮助(*^__^*)
- q6 E$ ?) l2 S6 q  [9 K6 q----------------------------------------------------------------------↓↓↓↓↓此位置↓↓↓↓求收藏↓↓↓求支持↓↓↓↓↓9 w1 N0 G) P3 t' c. B: ~3 w
收藏 6 评论30 发布时间:2015-9-6 14:48

举报

30个回答
拉肚肚 回答时间:2015-9-6 17:27:30
Inc_brza 发表于 2015-9-6 16:50
: ]/ B5 L! Z+ H( }, f/ j没啥神不神的,有基础,多复杂都不怕的,尽管是个柚子,把皮扒多几层,原型也就显露了!别神化这个指针,对 ...
2 J7 p; W, B9 P( s8 l
我觉得指针是C语言独特之处。
Inc_brza 回答时间:2015-9-6 16:50:40
没啥神不神的,有基础,多复杂都不怕的,尽管是个柚子,把皮扒多几层,原型也就显露了!别神化这个指针,对自己没多大用处。与其说他神,还不如把他征服,自己当神去吧!
拉肚肚 回答时间:2015-9-6 17:26:46
759611 发表于 2015-9-6 16:53
& P; U* @  V) m9 D8 e& y我发现楼主最近发了不少好贴呀!

  Y- D, X5 K/ U  I7 G我也是从网上复制来的,分享一下
拉肚肚 回答时间: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' |3 w5 p; e2 _* k
哦,也就是些基础,谢谢分享
( ?' I8 q/ M2 q8 ^3 o
谢谢回复
拉肚肚 回答时间:2015-9-6 17:27:45
6 W; h. x3 ?, ]- C* 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版