关于数组地址问题

c语言中“指针”是算是比较难的一个问题,而“指针”就是“地址”,知道数组的地址问题,才能在用指针数组的时候得心应手。
下面是一段代码

#include <stdio.h>

int main()
{
    int a[3] = {1, 2, 3};
    int b[2][3] = {1, 2, 3, 4, 5, 6};

    printf ("%p\t%p\n", &a, &a + 1);
    printf ("%p\t%p\n", a, a + 1);
    printf ("%p\t%p\n", &a[0], &a[0] + 1);
    printf ("%p\t%p\n", a[0], a[0] + 1);

    printf ("%p\t%p\n", &b, &b + 1);
    printf ("%p\t%p\n", b, b + 1);
    printf ("%p\t%p\n", &b[0], &b[0] + 1);
    printf ("%p\t%p\n", b[0], b[0] + 1);
    printf ("%p\t%p\n", &b[0][0], &b[0][0] + 1);
    printf ("%p\t%p\n", b[0][0], b[0][0] + 1);

    return 0;
}

在这段代码里我定义了一个 一维数组 a[3] ,一个二维数组 a[2][3];
如果 a 是数组名,也代表数组 a 的首地址,指向数组的第一个元素, 那么 a + 1代表什么呢? 在这里记住一句话“数组名不加取址符(&)时,往下降一级使用”
什么叫降一级?
一维数组 a 往下降一级就是 数组元素,那么 a + 1 的地址就等于 a 的地址加4,因为一个元素四个字节;
a [0]是数组a第一个元素的名字,也就是 “数组名”,元素降一级就是字节,我们不加&的时候,a[0] + 1 的地址就是 a [0]的地址加1;
再来看看二维数组:
二维数组 b ,加&时,&b也是代表数组首地址,但是 &b + 1 就等于 &b 的地址加上整个数组的字节数,跨过了整个数组,在这里数组字节数等于4*2*3=24;
b不加&时呢,往下降一级,二维数组降一级就到了 “行”,也就是说 b地址 相当于 &b[0] 地址,那么b + 1就是要加上一行的字节数8,在这里b[2][3]一行有两个元素,即8个字节;
那行再降一级呢?就到了元素,a[0] 是数组行名,并且没有加&号,那么它就降一级,到了元素,即 a[0] 地址等于 &a[0][0] 地址,所以 a[0] + 1 等于 a[0] 地址加 4;
那元素再降一级呢?又到了字节,就跟上面的一维数组一样啦,a[0][0]不加&,那么 a[0][0] + 1 地址就是 a [0][0] 加 1,因为是一个字节;

运行结果:
运行结果

a44 - a38 等于十进制 12
3c - 38 等于十进制 4
… … 依次算下来验证了上面说法的正确性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章