2007-2-25 23:59
shubulo
《再再论指针》 第五章 指向数组的指针
第五章 指向数组的指针
2u'UC([TLs#^e1|#Gy
讲到第五章了,数组两个字还离不开我们的左右,数组的内容也真多,另一方面也因为数组与指针的关系的确非常密切。
8\&AdI0gj#p"di
Q|1@K$Z5\)v
通常,对于int a[8][9]这个二维数组,我们可以这样定义一个指向它的指针:
gL3HtB*ca3L
OcGuo,W|)sQ
int (*p)[9];
:}4i/J,q/TJi_
^h'L+]`K\`*f
这个声明的形式跟人们所熟悉的int *p的形式大相庭径,初学者通常会感到迷惑,不理解的地方大致有四个:4P4[&w:l#i!L+fBc!d
$l.Cs(^;w~L"W
1。为什么会以这种形式声明?u-M2p-[*U8KZ4r
DFWo0q)I ~A R
2。(*p)应该如何理解? hf0T*N?D)u%b?Uw
c0J X
g/WDg
3。为什么必须把第二维显式地声明?,d
Ll3@+S$[!d.H
E s3z\_v"a
4。为什么忽略第一维?
`o\ SyI
RI,{G~nZ
下面我们就一起逐个讨论这四个问题:
|%Ym1V Wq#J'w*R
_)e
k p\3Z8q0b
1。这种形式是C标准的声明语法规定的,由于本章不是对标准的解释,只是对标准的应用,因此笔者尽量以简洁的方式解释这个声明,详细的讨论将在第七章进行。C标准的声明包含了两部分:
v.oi]Zt)J&W@
u$s9W5? x;bEmN
声明:m`
N5KRh|:s
"Xjp3VA4E3\^
声明说明符 初始化声明符表opt (opt的意思是可选)
@;t d+L3H-N
#Yb,Q#Q lB |
在声明说明符里面有一项类型说明符,int就是这种类型说明符。而初始化声明符表里面的其中一种形式,就是:K T0{$`YIDf
Mgi(M,fq)\7xL
直接声明符 [常量表达式opt]
fa$N%L
K
['v-xbf.[s
(*p)[9]就是这种直接声明符加[]的形式。Hv:R"A
J(b
8|9W;~ L w|p
2。p左边的*在这里不是取值运算符,而是一个声明符,它指出p是一个指针。而()括号是不能去掉的,如果去掉了,由于[]运算符优先级比*高,p就会先跟[]结合,这样p就变成了一个指针数组,而不是指向数组的指针。(sh_ ^;V"|'F3X
@0YGx)i*_%E"K3E
题外话:I/g-mjH:[)d
c