首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++ 不懂 初学者求解

2012-12-31 
c++ 不懂 菜鸟求解* 问题描述:采用指针访问方式从键盘给数组a【N】输入数据,然后对元素值重新按逆序存放并输

c++ 不懂 菜鸟求解

* 问题描述:采用指针访问方式从键盘给数组a【N】输入数据,然后对元素值重新按逆序存放并输出。
* 程序输出:
*/
#include <iostream>
using namespace std;
const int N=8;
void main()
{
int a[N],*p,*q;
for(p=a;p<a+N;p++)
cin>>*p;
p=a;q=a+N-1;
while(p<q)
{
int r=*p;
*p=*q;
*q=r;
p++;
q--;
}
for(p=a;p<a+N;p++)
cout<<*p<<' ';
cout<<endl;
}

     第7、8行代码不是太明白,a在这里是什么作用,p<a+N是怎么回事啊?
希望讲解详细点  指点下
[解决办法]
我先来自问自答一个你忽略的问题吧,就是为什么要把数组名a赋给一个单独的指针变量呢?a也是一个指针,指向的是数组的第一个元素的地址,即a代表的是&a[0]。
答:数组名是关联一块内存空间,但是数组名作为指针来说它是一个常量,不允许改动的,所以a++试图将指针移动到数组的下一个元素的做法是错误的,所以代码中出现了int *p = a;p++;这样子的代码。
为了更好的理解数组名是一个指针举一下几个例子:
用直接取下标的方法取出数组中的第一个元素是a[0];但是他是等价于*a的,其实更具体的应该是*(a+0)。再来说取第二个元素吧a[1]是等价于*(a+1)的。也就是说利用下标的方式去访问数组中的元素,每一次编译器要先到数组名所指向的数组空间的首地址处,然后再在这个地址的基础上往后跳相应的步数,取出元素的值。因为编译器每一次都要在一个固定地址的基础上往后跳,既然学了指针为什么不记录上一步的位置呢?所以你的代码中的两个指针变量p与q分别记录的是数组空间的首尾地址,这样子p++就可以跳到下一个位置,在大数组的情况下确实提高了数据的访问速度,那两个指针变量的空间几乎可以忽略了。

下面细说代码吧

#include <iostream>
using namespace std;
const int N=8;
void main()
{
    int a[N],*p,*q;
    for(p=a;p<a+N;p++) 
        cin>>*p;
    p=a;q=a+N-1; //记录数组的首尾地址
    while(p<q)
    {
        int r=*p;
        *p=*q; //利用*取指针变量所指向内存空间的内容,这个应该学了指针的都知道吧
        *q=r;
        p++; //首尾指分别向中间靠拢
        q--;
    }
    for(p=a;p<a+N;p++)
        cout<<*p<<' ';
    cout<<endl;
}

热点排行