数组的奥秘——一维数组

在谈论C/C++的时候,就不可避免的会谈到数组和指针,很多时候我们会将这两者搞混。

在这里,我们会谈到一维数组,加深对其的理解。

对于下面这样一个定义:

int a[5];

定义了一个整形的数组,数组名为a,有5个元素。

那么 a ,&a ,&a[0] 这三者之间有什么区别呢?

我们先通过VS来测试一下

#include<iostream>
using namespace std;
int main(){
    int a[5] = { 1, 2, 3, 4, 5 };
    cout << "a=" << a << endl;
    cout << "&a=" << &a << endl;
    cout << "&a[0]=" << &a[0] << endl;

    cout << endl;    
    system("pause");
    return 0;
}

先看下他的运行结果:

image

我们可以看到,其实三个表达式的值都是一样的,那么他们的区别在哪里呢?

毫无疑问,对于三个表达式的值,我们肯定可以确定,这个值就是数组的地址。其中 &a[0] 代表数组首元素的地址,它的值和数组的地址是一样的。那么 a 和 &a 到底代表什么呢?

我们将表达式的值加 1 ,看看它的值是什么。

#include<iostream>
using namespace std;
int main(){
    int a[5] = { 1, 2, 3, 4, 5 };
    cout << "a=" << a << endl;
    cout << "a + 1=" << a + 1 << endl;
    cout << endl;
    cout << "&a=" << &a << endl;
    cout << "&a + 1=" << &a + 1 << endl;
    cout << endl;
    cout << "&a[0]=" << &a[0] << endl;
    cout << "&a[0] + 1=" << &a[0] + 1 << endl;
    cout << endl;    
    system("pause");
    return 0;
}

运行结果如下:

image

从这里我们可以看出一些区别来了。首先,&a 和 a , &a[0] 是不一样的,我们现在来分析他们的值:

对比 a 和 a+1 : a + 1 比 a 多了 0x4,也就刚好一个 int 型数据的大小,这个和 &a[0]+1 的结果是一样的。在这里我们应该可以推断, a 代表数组首元素的地址,其性质和 &a[0] 是一样的。我们通过以下代码来验证:

#include<iostream>
using namespace std;
int main(){
    int a[5] = { 1, 2, 3, 4, 5 };
    cout << "采用 a+i 形式输出数组元素:" << endl;
    for (int i = 0; i < 5; i++){
        cout << *(a + i) << "\t";
    }
    cout << endl;
    cout << "采用 a[i] 下标形式输出数组元素:" << endl;
    for (int i = 0; i < 5; i++){
        cout << a[i] << "\t";
    }
    cout << endl;
    system("pause");
    return 0;
}

结果如下:image

说明我们的推断是正确的。

我们再来分析 &a 和 &a + 1 :我们从它的结果来看,&a + 1 刚好在 &a 的基础上增加了 0x14,也就是十进制的20 字节。它刚刚好等于整个数组的大小,也就是说 &a + 1 其实是下一个数组的地址。这样我们就可以推断 &a 代表整个数组的地址。

其实这个我们可以通过VS内建的调试工具——来说明;我们在调试的时候设置断点,通过内存查看器来验证:

image

通过以上的分析,我们总结如下:

int a[5] = { 1, 2, 3, 4, 5 };
    a;//代表数组的首元素地址
    &a;//代表数组的首地址
    &a[0];//代表数组首元素的地址
//三者的值虽然是一样的,但是含义确实不一样的

一维数组的分析就到这了,精彩还在后头哦。。。。

posted @ 2013-12-04 19:11  fclz  阅读(160)  评论(0编辑  收藏  举报