下面程序应该输出多少?
1
2
3
4
5
6
7
8
9
10
11
12
|
char
*c[] = {
"ENTER"
,
"NEW"
,
"POINT"
,
"FIRST"
};
char
**cp[] = { c+
3
, c+
2
, c+
1
, c };
char
***cpp = cp;
int
main(
void
)
{
printf(
"%s"
, **++cpp);
printf(
"%s"
, *--*++cpp+
3
);
printf(
"%s"
, *cpp[-
2
]+
3
);
printf(
"%s\n"
, cpp[-
1
][-
1
]+
1
);
return
0
;
}
|
POINTERSTEW
FERSTEPOINW
NEWPOINTW
POINTFIREST
正确答案: A 你的答案: C (错误)
虽然项目中不这么用,但是要答对还是需要扎实的基础知识。
其中考了指针应用,隐含中也考了运算符优先级的问题(*--*++cpp+3)
具体运算符优先关系记忆这个写的比较好http://blog.csdn.net/skywalker_leo/article/details/6237222
c是一个指针数组,每个数组单元都是一个指针,指向一个字符创。
即c[0]="ENTER"......c[3]="FIRST"
由于[]与*运算本质几乎是一致的,以下用[]替换*更容易理解。
c[i]=*(c+i)
c和c+i都是char*[]类型,它可以退化成char**类型,它正好是一个char**数组
cp[0]=c+3 .....cp[3]=c
引用后cp[0][0]=*(c+3)=c[3]="FIRST"
cp是char**[]类型,它可以退化成char***类型,正好与cpp类型一致。
1>++ccp的值是cp+1 *++p=*(cp+1)=cp[1] **++p=*(cp[1])=c[2]="POINT"
2>运算符优先级决定运算先后关系
++ccp的值是cp+2 *++p=*(cp+2)=cp[2]=c+1 --*++p=c *--*++p=*(c+0)=c[0]="ENTER"再+3字符串指向"ER"
3>cpp的值为cp+2 cpp[-2]=*(cpp-2)=*(cp+2-2)=cp[0]=c+3再引用*(c+3)=c[3]="FIRST"字符串指到"ST"
4>cpp的值没变,cpp[-1]=*(cpp-1)=*(cp+2-1)=cp[1]=c+2再[-1]得*(c+2-1)=c[1]="NEW",+1字符创指针指到"EW"
翻来覆去,记得这个换算关系式即可,c[i]=*(c+i)。
首先看 C,CP,CPP 之间的存储关系
![](https://i-blog.csdnimg.cn/blog_migrate/f35b7a51b1b39a68f98fc846cc6b6753.png)
计算各个表达式结果的过程如下图
![](https://i-blog.csdnimg.cn/blog_migrate/8471569ed164a56d44ae101ade3231fa.png)