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 
 
就是第五种情况,弄错,希望自己以后注意。
 
 
原创粉丝点击