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

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

[复制链接]
拉肚肚 发布时间:2015-9-6 14:48
今天阅读《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

; M' o! F& ]: E8 ?" W! \. J1.int *p;
& \% g; N7 A4 Z  w* B7 }* S# ], B6 S: g2 C5 B0 i) a  l
2.int **p;
" S) @1 e. V: Q! d
1 T( d: G7 L; ?0 P3.int *p[10];* M* a$ z; l& @( S4 }

3 U7 t9 i! c) ]. u; |; K3 ~+ r4.int (*p)[10];5 S4 x6 g2 w  {2 T9 Q7 d3 h4 ?

$ I& ^/ V* U0 o5.int *p(int);/ r7 z/ a; J6 u, V" h( v

$ a& {5 e* [  Y6.int (*p)(int);2 a: N) c6 m3 W5 h

8 C' R$ A  W. t( {4 f7.int (*p[10])(int);0 o- {1 x( \0 a5 \3 K% M; y2 v5 q) W
* S. ~) [$ ]* J8 Y9 `) p
这七个难度还不是很大,相信大多数读者都能够答的出来。
. Q6 r) t. n7 H" s# K: E# ]
, O9 U( F. \; Q% F8 t  v' n4 [答案:
" v6 o. W4 L/ r9 m( e( d$ W3 e: a: I' h7 k( u8 s" i2 Z; {
1.一个指向整型数据的指针' {/ U5 u  K8 [' _+ [9 Y0 Q! \
, X; O% u* `, W5 L4 ~
2.一个指针的指针,它指向的指针指向一个整型数据
* V; `+ B0 `% a1 e) j5 T& ~7 ?2 s6 _( ^+ T
3.一个有十个指针的数组,该指针指向整型数据
8 o8 E# X% ?8 @2 k" U% _1 o: H) _5 a5 }! x: a
4.一个指向有十个整型数据数组的指针
! T, h' L+ T6 A: V" q+ r
( K0 w; z. L4 r! v9 R8 P; q4 l% l$ I5.就一个函数(不是函数指针),该函数有一个整型参数,返回值为一个指向整型的指针3 g: t* z0 Z  j

3 W5 l1 Q. c0 Y4 a* w. Q, a+ J6.一个函数指针,该函数有一个整型的参数,返回值为整型类型
+ R5 Q5 c' m5 O/ I- A2 a+ R3 ]0 Q% 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
啊,当时看完我就吁了口气,真神一般似的,但是但我接着看下去,下面有碰到一个,我彻底崩溃了.......
, ^3 b; n9 w# k& q: G: A' ?" I- @: E7 b  S

8 ^2 w5 E& ?4 H
. D- Q3 o* f. k5 p题目是这样的:
8 \  Y" |! H& ^" M
  E: y0 i5 q0 u/ p8 e  D# J5 O5 ?请解析 (*(void (*)())0)() 的含义。// 怎么样?要HOLD住阿!
& W4 E9 n0 X, `' ]
: m4 w5 N8 z  V) `! ?+ d' f3 G9 e; R分析问题:+ p) h. O4 N' M8 F& r; h$ C- v/ G

' w+ z# ~1 e4 u: N) L7 H不卖关子了,但是我早HOLD不住了。书中的答案是这样的,* ]2 y  o# l8 T$ s

9 k- c! {+ X$ f$ J有些微处理器从0地址启动,有时为了模拟开机时的情形,需要设计一条C 语句,去执行0地址的内容,于是就有了(*(void (*)())0)() 这条语句。6 S( Q# j" q- x, N9 x- y* v

5 s6 }# e. @3 [9 W* ]: f! w5 Y0 n这条语句一眼看上去让人头疼,但分析之后还是挺简单的。# }/ J6 K. V+ \) r1 s# x

; F' W- X8 c/ X# W6 h首先,当有如下函数声明时:. `+ }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);
& E  v2 K9 G: w) D. n- S% G. k& y, j+ E/ C9 j3 C" Y# I
题目的函数没有参数,所以就简化成fun();
/ \4 N. }+ o# H2 s' O' N: F/ `
: p6 J' U' P* ~) a+ R+ w' g而0是这个函数的入口地址,即0就是这个函数的指针值,指针的函数声明为:
' R5 o) d5 l5 i, `7 g7 @  ^) ^3 O% Y
0 t  J3 E; p$ T% W; X7 Gvoid (*pFun)(param);' _  D( }! ]% O* d% o' t: B+ s- M

" c" B( N; \! w& b) h调用形式为:(*pFun)(param);
" Q6 J! w2 C7 |+ F" `& f! 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所指向的函数。
6 `2 |. N; l+ S8 v. i/ S- F8 R
5 b7 x5 `* q; p1 @可以用typedef来加深对本句的理解,如下:
1 M' c0 V* O7 |4 ~+ {
# E4 u' i% Y# m% x& l& v2 V% ptypedef void (*pFun)();/ _% w: k; A* Z5 {

' A  @( k4 z6 ^) \8 x2 c((*pFun)0)();. e- J% ]# P5 N" @' s0 M3 @
% ~9 f$ ~9 x1 S
这两句和(*(void (*)())0)()是等价的,但是这样更有助于加深对本句的理解。
* O. p3 Y$ X5 Q; _! J  J8 ~3 J& n2 q' U% G
总结:(*(void (*)())0)()就是 *(void (*)())0 所对应的函数的调用。
/ W) D+ e: U6 U2 _9 I, y. p2 y1 b2 W0 Y3 B

1 _' w# h$ ]% G5 q; b
7 C& S% L  n8 W3 W) S神一般的C语言指针.....希望对大家掌握指针有所帮助(*^__^*) / L0 T5 _; `0 q* z
----------------------------------------------------------------------↓↓↓↓↓此位置↓↓↓↓求收藏↓↓↓求支持↓↓↓↓↓& s5 }  \' w+ a( B& b
赞 收藏 6 评论30 发布时间:2015-9-6 14:48

举报

30个回答
拉肚肚 回答时间:2015-9-6 17:27:30
Inc_brza 发表于 2015-9-6 16:50- i9 O$ U0 w% A9 H" z* H
没啥神不神的,有基础,多复杂都不怕的,尽管是个柚子,把皮扒多几层,原型也就显露了!别神化这个指针,对 ...
4 M& o; }4 f. t
我觉得指针是C语言独特之处。
Inc_brza 回答时间:2015-9-6 16:50:40
没啥神不神的,有基础,多复杂都不怕的,尽管是个柚子,把皮扒多几层,原型也就显露了!别神化这个指针,对自己没多大用处。与其说他神,还不如把他征服,自己当神去吧!
拉肚肚 回答时间:2015-9-6 17:26:46
759611 发表于 2015-9-6 16:53: e, {) K  a1 V  S! T: K8 q
我发现楼主最近发了不少好贴呀!
6 z9 y& |& L, R! B
我也是从网上复制来的,分享一下
拉肚肚 回答时间: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:569 O* X3 i( K4 ^# r. u( g9 c
哦,也就是些基础,谢谢分享

7 s$ t. F6 U+ R( Y2 m* u谢谢回复
拉肚肚 回答时间:2015-9-6 17:27:45
5 }& K2 Y* w5 b% K, y$ d
数码宝贝,又看到你了
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 手机版