20180601 指针

下面程序应该输出多少?
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 之间的存储关系
 
 
计算各个表达式结果的过程如下图

猜你喜欢

转载自www.cnblogs.com/kxzh/p/9150869.html
今日推荐