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

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

[复制链接]
拉肚肚 发布时间:2015-9-6 14:48
今天阅读《C/C++程序员面试指南》中指针一块,以前一知半解的指针问题顷刻间懂了。- t4 Y+ {& ~/ o- T
7 @* K; F2 k: `; e0 f
下面,可以做个测试,如果下面的指针问题你能够全都解答正确,那么你的C语言功底真是神一般的了。
" Y0 T. V* C* @, Q# m( d) s3 {# I6 Q- S( r6 _
1.int *p;
- P1 @: Z) s1 S# A" E* Q7 ]4 ^& }7 [  Y1 |
2.int **p;
3 M% w5 m, f8 w
: R. y) Q: f1 g# R1 h1 n3 N$ B- Y/ m3.int *p[10];" l1 b3 Z; l* }3 z% X' V
1 H* U1 N0 q9 v7 \% p# ?/ F! G
4.int (*p)[10];" n2 f' Q9 k; n# o/ s7 }

6 U( G8 Q& S1 U5.int *p(int);1 E/ B! W1 e% P- \9 @0 C

. z! ~9 R$ Z3 w/ V6.int (*p)(int);
2 T) X# X9 h7 I$ o" E* D( f/ d) t* {( U( a' I* l0 l
7.int (*p[10])(int);
& k5 a0 [2 H# L" Q: @4 @( U5 N' Z1 i" U! [& g
这七个难度还不是很大,相信大多数读者都能够答的出来。5 q: E/ y% z6 k4 W
: H- ~0 _2 }8 V0 h  \
答案:
6 k4 l7 s% D" o2 |" Q( s% O' P; j: f" ^8 I/ _& ]
1.一个指向整型数据的指针
, ?3 e! e! x$ c( O
! G- F! s$ e/ B2.一个指针的指针,它指向的指针指向一个整型数据
1 I8 Y* H  H% X6 o, N  c$ w. \# c" l0 y$ V$ d3 C% N
3.一个有十个指针的数组,该指针指向整型数据
) |$ Q: `  X6 d* J$ N& I0 g% Q, M8 T# C( S  I. @( n0 @) _/ v7 p) Y+ }
4.一个指向有十个整型数据数组的指针
" s+ v0 y* f& c$ w- U6 t  o7 B$ N0 `- i, d
5.就一个函数(不是函数指针),该函数有一个整型参数,返回值为一个指向整型的指针) a8 c; \7 f' P- Q' J$ x! M+ c

- ^/ _* v2 ]4 ~' Z3 ?  t2 v: i6.一个函数指针,该函数有一个整型的参数,返回值为整型类型
: n+ F. A0 L. W" ~# K3 m# ~- i, w5 O
7.一个有十个指针的数组,该数组中的指针指向一个函数,该函数有一个整型参数并返回一个整型数  W+ \* g& F4 Y$ a: x0 n8 H

$ K4 o3 s% m; p' W啊,当时看完我就吁了口气,真神一般似的,但是但我接着看下去,下面有碰到一个,我彻底崩溃了.......
2 J; Z( R6 i9 l! R, d& l5 r$ |/ m7 E/ o% {
$ F& Q8 `- c% f8 N' N
4 x# W  K8 B2 h1 n8 ]
题目是这样的:1 C- J$ u9 z6 _( d: t+ k* Z' I; R
8 R6 T# k2 ^) f) L" a. t9 x$ w' |& D
请解析 (*(void (*)())0)() 的含义。// 怎么样?要HOLD住阿!
! x% R% \% D) M; A& y; J+ X$ A0 b- c
分析问题:
( d% A( n: R% j! _- v4 }
! G1 }2 b& S( n1 e! A/ l不卖关子了,但是我早HOLD不住了。书中的答案是这样的,
, w/ A6 \5 s5 s2 O/ d
2 e; [  K! o2 Y! y0 u$ Q) i有些微处理器从0地址启动,有时为了模拟开机时的情形,需要设计一条C 语句,去执行0地址的内容,于是就有了(*(void (*)())0)() 这条语句。
9 g( A2 Z& h* Y' S* r" q) V9 Q7 h0 U8 v8 I. {
这条语句一眼看上去让人头疼,但分析之后还是挺简单的。$ H7 p3 f, l! Y. ]4 i

1 |/ |! O# ]* b首先,当有如下函数声明时:
9 M+ a1 G+ \7 S& F0 _% w# k
) k. z% d6 ^# Z7 N) ^0 Evoid fun(param);( T- u7 Q9 \6 _& a0 m! |7 F
7 {/ o( B* P. J* A, r
这个函数的调用形式为:fun(param);
1 \4 {8 R+ F: S' H* `  S" j8 r1 n2 Y- \# g
题目的函数没有参数,所以就简化成fun();$ F. ^# D6 l3 G6 y. |/ d, p4 B* |4 Y

) a4 V5 o; O3 Y/ A而0是这个函数的入口地址,即0就是这个函数的指针值,指针的函数声明为:
8 Q, {. w) l6 S8 G, \, p+ A, X# }* e, N. ]$ p1 ~
void (*pFun)(param);) H( \: e( |% i1 y# Q6 h

- R5 j  x; K2 v2 H调用形式为:(*pFun)(param);
3 E' F* p: F7 r: r9 P
- A, Q2 q* ?6 y4 J8 n5 U: z对于本题可以写成:( *0 ) ();
* J2 i& f; y" _: ~7 j! c4 w
5 H/ H7 W- e$ y! e- d7 ~但是函数指针变量不能是个常数,所以还要把0强制转换成函数指针,根据原题可以元函数的函数指针原型为 void (*)();1 q8 q$ b2 z1 j5 q$ T

3 _0 _, h. R9 y8 ]" |+ ?# G于是(*(void (*)())0)()可以这样来分析,首先用void (*)()把0强制转换成了函数指针,然后再调用函数指针0所指向的函数。
( M. L, Q- g5 c% b- t: i$ G, P2 Z" p( }7 q: F3 v) }6 t
可以用typedef来加深对本句的理解,如下:1 F( u: _" P  T9 h! P5 n
6 v6 x) U  |- q5 @. q4 `
typedef void (*pFun)();
2 h' N7 B' e9 P9 t# R7 t6 Z* ~" C- U8 @9 x( |
((*pFun)0)();+ J' C0 @, l6 h6 v/ i- d
4 c  Z4 H+ n5 W0 n/ [
这两句和(*(void (*)())0)()是等价的,但是这样更有助于加深对本句的理解。1 x  ^) J, ]  b& b6 Z

+ X$ b& m, M  Z$ e; c* A3 {总结:(*(void (*)())0)()就是 *(void (*)())0 所对应的函数的调用。+ a9 a' ]' v1 F

  R6 d7 ]2 t. T3 |4 [! F" ~" u7 G* k9 N5 \
# t0 c/ x5 w3 o
神一般的C语言指针.....希望对大家掌握指针有所帮助(*^__^*)
( s. m; W/ L( [  j, C' x# ?----------------------------------------------------------------------↓↓↓↓↓此位置↓↓↓↓求收藏↓↓↓求支持↓↓↓↓↓
9 ~$ \! p6 y/ W' j
收藏 6 评论30 发布时间:2015-9-6 14:48

举报

30个回答
拉肚肚 回答时间:2015-9-6 17:27:30
Inc_brza 发表于 2015-9-6 16:50
. G* u' b" n0 [8 Y1 r" {没啥神不神的,有基础,多复杂都不怕的,尽管是个柚子,把皮扒多几层,原型也就显露了!别神化这个指针,对 ...

4 h+ q2 Z5 R6 @9 ^$ G- j0 X我觉得指针是C语言独特之处。
Inc_brza 回答时间:2015-9-6 16:50:40
没啥神不神的,有基础,多复杂都不怕的,尽管是个柚子,把皮扒多几层,原型也就显露了!别神化这个指针,对自己没多大用处。与其说他神,还不如把他征服,自己当神去吧!
拉肚肚 回答时间:2015-9-6 17:26:46
759611 发表于 2015-9-6 16:53
4 C! i, l9 a' H5 U我发现楼主最近发了不少好贴呀!

3 p7 j, ?, R# E: J我也是从网上复制来的,分享一下
拉肚肚 回答时间: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% v$ y1 d# i  n( X: a% H
哦,也就是些基础,谢谢分享

$ ?" Z9 u# r, I6 X+ X) v谢谢回复
拉肚肚 回答时间:2015-9-6 17:27:45

) ~* R) F  z1 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 手机版