關於數組地址問題

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
… … 依次算下來驗證了上面說法的正確性。

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