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

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

[复制链接]
拉肚肚 发布时间:2015-9-6 14:48
今天阅读《C/C++程序员面试指南》中指针一块,以前一知半解的指针问题顷刻间懂了。
' F8 D7 \7 R# _  {1 H6 x4 }9 S6 d( v
下面,可以做个测试,如果下面的指针问题你能够全都解答正确,那么你的C语言功底真是神一般的了。, |, j. |" ~: A7 N9 t' H
( ~6 ^. h. G( x6 H
1.int *p;1 ?+ U) ~" z6 d  N/ o9 V5 L: ~+ j
" @4 e5 n5 d" Y0 f, X" o: m  |* @: h
2.int **p;
( i/ e$ u* b7 A2 t! X7 r7 T/ ^4 E: Q. j4 G% |9 R
3.int *p[10];' l3 e& ]3 r( s8 H
5 ~& S8 a2 h' ~( i: b
4.int (*p)[10];2 C8 a, T+ o$ w+ j( N
* }3 j' |& v& T! C- E
5.int *p(int);; p  e6 p7 K+ T$ {. ]8 ?
3 C' ~. A  p1 g& k& e. i/ D
6.int (*p)(int);
8 z1 |# i4 C# y$ ?7 S; e, \# T. l0 ~" o& w, L) h) i
7.int (*p[10])(int);1 B9 x9 l" W5 {+ {

/ {& h- U2 i1 b1 F% r1 T3 ?( r- T8 y这七个难度还不是很大,相信大多数读者都能够答的出来。
9 O' e+ o5 b8 a& x( Y' \  l* m9 ~
& ~! D& j7 Z+ K: r" p( J答案:
0 O+ A" ^4 n, {- _6 g/ O! V/ m; `  b. A: `0 b( X1 E( B# l
1.一个指向整型数据的指针- p9 d: g0 R" T8 Y% H# b1 n
2 c7 R6 W) W; Z# I' a/ f
2.一个指针的指针,它指向的指针指向一个整型数据
/ S; c" W, h, y1 v. m8 z
& ]5 n7 u0 y% v7 Z  a, |3.一个有十个指针的数组,该指针指向整型数据
7 h' {; F3 f, r' K( q8 D" C4 \# K$ k, g0 |! [% X
4.一个指向有十个整型数据数组的指针
) x( J$ i; z: j" ^; N) ?  E2 u
6 L; l* p! r# l5 X1 D5.就一个函数(不是函数指针),该函数有一个整型参数,返回值为一个指向整型的指针
( M  n( [# z3 ]& z; f5 h$ P$ I2 M1 o
6.一个函数指针,该函数有一个整型的参数,返回值为整型类型* x$ _$ F4 P4 p$ b6 B$ \
% f3 Z' ~% I2 [0 V( @2 j
7.一个有十个指针的数组,该数组中的指针指向一个函数,该函数有一个整型参数并返回一个整型数
% g3 ^! B* D& V0 `* l$ I! I4 w
' f) z0 s! E2 Z/ z6 c* A2 C& _啊,当时看完我就吁了口气,真神一般似的,但是但我接着看下去,下面有碰到一个,我彻底崩溃了.......
0 ]+ d4 C3 }9 e& G, Z+ [& Z/ f& v: o5 E4 m- o
7 H0 A" G8 z1 f- i( f4 p
  u% v- y7 ?0 H( e' _! B& Z
题目是这样的:4 v9 O+ u- T( p' ^6 I6 U& H8 n' T% @

  Q: c' l* z9 g请解析 (*(void (*)())0)() 的含义。// 怎么样?要HOLD住阿!7 I* B1 Q. H. C

. ~$ f. p8 N% a0 u分析问题:4 {5 y1 q" k# w0 C# v0 B$ o

- J, z) s, W0 Y( E1 J9 F) R不卖关子了,但是我早HOLD不住了。书中的答案是这样的,
3 j5 k2 r4 D* C( r, G( d% r. ]1 r! b( `  ^
有些微处理器从0地址启动,有时为了模拟开机时的情形,需要设计一条C 语句,去执行0地址的内容,于是就有了(*(void (*)())0)() 这条语句。* F$ h- X% W( d8 M+ c
; @$ M- ~) `3 G1 Y: e. I
这条语句一眼看上去让人头疼,但分析之后还是挺简单的。$ B; l2 F9 B1 {0 `5 L4 O7 y- I

1 h# L0 _2 \  }8 r6 d4 c7 {* T首先,当有如下函数声明时:
; A: ?# L+ S# N0 a/ o2 M
& {% C# K2 e* _' Q( Jvoid fun(param);
' k. W: M4 h  @  y; T3 s# ]
$ k3 T1 h4 o( ]0 `4 \4 q5 q这个函数的调用形式为:fun(param);
  M7 f# M6 v% x! e8 m0 j% e  \/ s0 C5 \
题目的函数没有参数,所以就简化成fun();1 K0 Z0 r" O! y8 u9 U

* l% b, R$ {, V$ z# O5 p而0是这个函数的入口地址,即0就是这个函数的指针值,指针的函数声明为:
1 h0 k, a5 |' J) G2 r/ Q- j
, w8 E/ p( l! N; r% Dvoid (*pFun)(param);6 G/ X" y! u2 R7 h+ @8 j$ G$ C

0 l; d- f  r3 z# X( X调用形式为:(*pFun)(param);
5 y0 [$ x% X) M' e( `9 j1 b/ }& o) z7 k. ~+ W  }  w
对于本题可以写成:( *0 ) ();. g: B: L2 Z) G/ W& h) b
8 f" {0 b' s/ |, j9 v
但是函数指针变量不能是个常数,所以还要把0强制转换成函数指针,根据原题可以元函数的函数指针原型为 void (*)();8 q: W6 P. q  A

6 Z/ O' A' V) D4 T. i+ \) `8 b6 E于是(*(void (*)())0)()可以这样来分析,首先用void (*)()把0强制转换成了函数指针,然后再调用函数指针0所指向的函数。
9 \6 E% I( e4 R
+ }. {% q- S8 B可以用typedef来加深对本句的理解,如下:
1 T  K1 A* ~& x5 n" @) P3 X+ b
: \# p* D- ]# Ktypedef void (*pFun)();, \& @$ e3 ?# d4 @

9 O/ z3 G  D# S- j  K9 \((*pFun)0)();& ]: k! x4 u$ n3 n* m- ^! a' ^

7 v$ u7 \! p9 ~这两句和(*(void (*)())0)()是等价的,但是这样更有助于加深对本句的理解。
5 \3 ~4 c( v/ T3 R6 G% i9 d# x; _
* Q: t4 S6 f! v总结:(*(void (*)())0)()就是 *(void (*)())0 所对应的函数的调用。
0 {+ |) z8 Y8 _: l& S
2 i8 D# W3 L1 h- ^5 t3 u9 {4 H9 k) b# o( F, _' ^8 r7 [
; I* B# I" j/ V2 A- [7 I
神一般的C语言指针.....希望对大家掌握指针有所帮助(*^__^*) . W: e5 V0 \. K3 U1 ?# y: h
----------------------------------------------------------------------↓↓↓↓↓此位置↓↓↓↓求收藏↓↓↓求支持↓↓↓↓↓
2 a. @6 Z+ l  M. \7 h6 d) S( c
赞 收藏 6 评论30 发布时间:2015-9-6 14:48

举报

30个回答
拉肚肚 回答时间:2015-9-6 17:27:30
Inc_brza 发表于 2015-9-6 16:509 w9 N) @2 Y; r' \& j" J
没啥神不神的,有基础,多复杂都不怕的,尽管是个柚子,把皮扒多几层,原型也就显露了!别神化这个指针,对 ...

  y( T$ n4 ~! _4 O+ G1 |3 V我觉得指针是C语言独特之处。
Inc_brza 回答时间:2015-9-6 16:50:40
没啥神不神的,有基础,多复杂都不怕的,尽管是个柚子,把皮扒多几层,原型也就显露了!别神化这个指针,对自己没多大用处。与其说他神,还不如把他征服,自己当神去吧!
拉肚肚 回答时间:2015-9-6 17:26:46
759611 发表于 2015-9-6 16:53: B: c) K7 q, B/ A
我发现楼主最近发了不少好贴呀!
* T: ~0 D5 h* ^) _4 _
我也是从网上复制来的,分享一下
拉肚肚 回答时间: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
/ x, |: r. ~8 W7 N8 \1 i哦,也就是些基础,谢谢分享
3 q) H* w: x# M; s
谢谢回复
拉肚肚 回答时间:2015-9-6 17:27:45

6 o6 i0 f! h# o( |4 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 手机版