您的位置:首页 > 编程语言 > C语言/C++

c语言解惑里面典型指针题目分析2

2008-06-04 21:20 507 查看
 
请问下面这个程序输出是什么:
 #include “defs.h”
 
Int a[]={0,1,2,3,4};
Int *p[]={a,a+1,a+2,a+3,a+4};
Int **pp=p;
 
Main()
{
PRINT2(d,a,*a);//a是数组的地址1,*a是第一个元素值
PRINT3(d,p,*p,**p);//p是指针数组地址2,*p表示是指针数组第一个元素,即是a也即是数组地址1,**pp也就是a的值
 
PRINT3(d,pp,*pp,**pp);//pp是等于p,所以pp也就是指针数组地址2,*pp等价于*p,**pp等价于**p,与上面的输出完全相同。
 
 
pp++;PRINT3(d,pp-p,*pp-a,**pp);   //pp++,pp本来是等于p数组首地址,也即是指a,
pp现在指向a+1所在的p[1];
*pp++; PRINT3(d,pp-p,*pp-a,**pp); // *pp++等价于*(pp++); 现在pp指向a+2所在的p[2]
*++pp; PRINT3(d,pp-p,*pp-a,**pp); //*++pp等价于*(++pp),现在pp指向a+3所在的p[3]
++*pp; PRINT3(d,pp-p,*pp-a,**pp); // ++*pp等价于(++(*pp)),因为pp指向a+3所在的p[3],那么(*pp)=a+3, (++(*pp))就是将a+3所在的p[3]变为a+4,那么此时**pp=4
 
NL;
 
 
pp=p;                            //pp重新指向a
**pp++; PRINT3(d,pp-p,*pp-a,**pp);  //**pp++等价于(*(*(pp++))),所以pp指向a+1所在的p[1]
*++*pp; PRINT3(d,pp-p,*pp-a,**pp); //*++*pp等价于(*(++(*pp))),因为pp指向a+1所在的p[1],那么*pp代表p[1],那么++(*pp)表示将a+1所在的p[1]变为a+2.
                                 此时**pp=2
++**pp; PRINT3(d,pp-p,*pp-a,**pp); //++**pp等价于(++(*(*pp))),因为**pp指向a[2],等于2,++(**pp)也即将a[2]改为3
 
 
根据上面的分析:
输出如下:
 
1.       a=Int数组地址1 *a=0
2.       p=指针数组地址2   *p=int数组地址1   **p=0
3.       pp=指针数组地址2   *pp=int数组地址1   **pp=0
4.       pp-p=1   *PP-a=1     **pp=1
5.       pp-p=2   *PP-a=2    **pp=2
6.       pp-p=3   *PP-a=3    **pp=3
7.       pp-p=3   *PP-a=4   **pp=4
8.       pp-p=1 *PP-a=1   **pp=1
9.       pp-p=1 *PP-a=2    **pp=2
10.   pp-p=1   *PP-a=2    **pp=3
 
 弄懂这个题目,相信对指针的理解会更进一步!
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  语言 c