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语言解惑上面一个数组指针题目分析
- 数组名与指针典型面试题的分析(1)
- c++指针经典题目分析
- [Leetcode][双指针/多指针]相关题目汇总/分析/总结
- 数组名与指针典型面试题的分析(2)
- 数组名与指针典型面试题的分析
- C++指针加减-题目分析
- 数组名与指针典型面试题的分析(1)
- 数组名与指针典型面试题的分析(转)
- 数组与指针典型面试题分析--深入理解指针含义
- 数组名与指针典型面试题的分析(转)
- 数组名与指针典型面试题的分析(2)
- 系统集成资质培训 - 论文如何写-几个典型题目写作分析
- 一个小题目分析
- HDU-3829 Cat VS Dog(最大独立集及对题目的分析)
- 启动erlang/OTP里面的Web服务器(application INETS启动过程代码分析)
- DirectShow Filter 开发典型例子分析 ——字幕叠加 (FilterTitleOverlay)1
- 信息化基础知识 典型试题分析
- 一个JAVA单例模式的典型错误应用的分析和解决方法