C语言解惑上面一个数组指针题目分析
来源:互联网 发布:学单片机从哪里入手 编辑:程序博客网 时间:2024/04/29 14:32
请问:下面这个题目的输出是什么?
#include"defs.h"
int a[]={0,1,2,3,4};
Main()
{
int i,*p;
for(i=0;i<=4;i++) //第一个for
PR(d,a[i]);
NL;
for(p=&a[0];p<&a[4];p++) //第二个for
PR(d,*p);
NL;
NL;
for(p=&a[0],i=1;i<=5;i++) //第三 个for
PR(d,p[i]);
NL;
for(p=a,i=0;p+i<=a+4;p++,i++) //第四个for
PR(d,*(p+i));
NL;
NL;
for(p=a+4;p>=a;p--) //第五个for
PR(d,*p);
NL;
for(p=a+4,i=0;i<=4;i++) //第六个for
PR(d,p[-i]);
NL;
for(p=a+4;p>=a;p--) //第七个for
PR(d,a[p-a]);
NL;
}
(1)第一个for :显然是下标从0到4
a[i]=0 a[i]=1 a[i]=2 a[i]=3 a[i]=4
(2)第二个for :p指向第一个元素,并且p不大于最后一个元素的地址,输出*p也即输出元素
*p=0 *p=1 *p=2 *p=3 *p=4
(3)第三个for :p指向第一个元素,i从1到5循环,p[i]也就等于a[i]
P[i]=1 p[i]=2 p[i]=3 p[i]=4 p[i]=?(此时下标越界)
(4)第四个for :p 指向数组首地址,i=0,循环条件p+i<=a+4,然后p++,i++
输出*(p+i),它首先是指向数组首地址,然后是p和I都每次加一,所以它一次间隔一个元素
*(p+i)=0 *(p+i)=2 *(p+i)=4
(5) 第五个for: p=a+4,即p 指向数组最后一个,即第四个元素,p 循环一次减一,循环条件是p>=a; 输出是p[-i]
I这个下标是负值,我没有注意到它p本身是指向第四个元素的,以为是数组越界(注意这里下标为负没有语法错误,属于数组越界),所以我的答案是:
P[-i]=0 P[-i]=? P[-i]=? P[-i]=? P[-i]=?
其实这里是这样的,当下标为0时,是a[4], 下标为-1时,是a[3],下标为-2时,是a[2];
下标为-3时,是a[1],下标为-4时,是a[0]; 从本质上面理解数组下标,即是数组元素相对数组首个地址的位移,当用一个指针p指向数组元素a[i]时,那么指针下标的基准就变成了a[i]了。
如下图所示:
所以输出结果为:
P[-i]=4 P[-i]=3 P[-i]=2 P[-i]=1 P[-i]=0
6) 第六个for: p=a+4,即p指向第四个元素,p每次减一,循环条件为p>a
输出a[p-a],即是用p与a之间的距离作为下标,首先p-a=4,所以依次为a[4]直到a[0]
A[p-a]=4 A[p-a]=3 A[p-a]=2 A[p-a]=1 A[p-a]=0
就是第五种情况,弄错,希望自己以后注意。
- C语言解惑上面一个数组指针题目分析
- c语言解惑里面典型指针题目分析2
- C语言指针快速解惑
- C语言数组与指针定义分析
- C语言指针问题快速解惑
- C语言指针问题快速解惑
- 转:C语言指针问题快速解惑
- C语言指针问题快速解惑
- C语言指针问题快速解惑
- C语言解惑:什么是数组名
- 一个c语言题目
- 数组概念和题目分析(C语言部分)z
- c语言 数组 指针
- C语言--指针,数组
- c语言指针数组
- c语言,数组指针
- C语言 指针数组
- c语言指针,数组
- An Inconvenient Truth - 告诉你真实的温室效应
- 彻底弄懂CSS盒子模式(DIV布局快速入门)
- 数据中心为什么要虚拟化
- 开始
- SQL 2000中如何实现异地备份
- C语言解惑上面一个数组指针题目分析
- Excel 表格图片压缩方法
- ubuntu Mp3 乱码
- VC的MySQL编程
- Java气泡提示功能实现
- CodeGear RAD 2007 SP4 最新下载及破解
- 湖大优秀论文要求
- 我经常浏览的网站
- struts标签