陣列 陣列名 陣列位址學習

2021-08-10 04:37:16 字數 2270 閱讀 3660

先來看乙個例子,然後通過分析例子來學習

#include int a[3] = ;

int main()

結果:

a = 0x555e35977010

&a = 0x555e35977010

a + 1 = 0x555e35977014

&a + 1 = 0x555e3597701c

我們來逐個分析:

1.陣列名的值是個指標常量,指向陣列的第乙個元素的位址或者說指向整個陣列的首位址

引用《c和指標》p141中的理論:

在c中, 幾乎所有使用陣列的表示式中,陣列名的值是個指標常量,也就是陣列第乙個元素的位址。 它的型別取決於陣列元素的型別: 如果它們是int型別,那麼陣列名的型別就是「指向int的常量指標「。

所以1列印出的位址就是該陣列首位址或者第乙個元素的首位址。

2.取陣列名的位址,就是取這個陣列的首位址。

引用《c和指標》p142中的內容,在以下兩中場合下,陣列名並不是用指標常量來表示,就是當陣列名作為sizeof操作符和單目操作符&的運算元時。 sizeof返回整個陣列的長度,而不是指向陣列的指標的長度。 取乙個陣列名的位址所產生的是乙個指向陣列的指標,而不是乙個指向某個指標常量的指標。

所以2的列印就是該陣列的首位址。結果和1列印是一樣的,都是陣列的首位址,但是該位址是指向陣列的,不是指向陣列元素的。

3.陣列名做位址時,位址加或減n,其實是移動n個陣列元素的位址長度。

這裡是+1,實際上位址向陣列後移動乙個元素的位置,即a=&a[0],a+1 = &a[1]。

所以3列印的是&a[1]的值,因為陣列是int型,所以和&a[0]和&a[1]相差4個位元組。

4.取陣列名的位址,位址加或減n,其實是移動n個陣列的位址。

這裡是+1,實際上位址向陣列後移動乙個陣列的位置,這裡陣列a的大小是12個位元組,需要向後移動12個位元組。

所以4列印出來的位址和&a[0]陣列位址相差12個位元組。

小結一下:

陣列名和取陣列名的位址都是指向整個陣列的首位址,也就是第乙個陣列元素的值。

但是在做運算的時候,陣列名移動的是n個數組元素

的位址長度,取陣列名位址移動的是n個陣列的位址長度。

前面說到,陣列名的值是乙個常量指標,所以只能讀,不能寫,下面一起學習下。

#include int main()

; int b[3] = ;

int *p = b;

a = p;

return 0;

}

編譯報錯:

error: assignment to expression with array type

a = p;

所以,陣列名是乙個常量位址,不允許修改。

但是陣列名的常量位址指向的資料是可以改變的。

#include int main()

; *a = 11;

*(a + 1) = 22;

printf("a[0]=%d,a[1]=%d,a[2]=%d\n",a[0],a[1],a[2]);

return 0;

}

結果

a[0]=11,a[1]=22,a[2]=3
還是先上例子:

#include void test(int a,int len)

int main()

; printf("the len of a in the main=%lu\n",sizeof(a));

test(a, 3);

return 0;

}

結果(這裡要特別說明下,因為我用的機器時64為的,所以乙個指標的長度時64bit,即8位元組,如果時32位的機器,第二個值應該為4)

the len of a in the main=12

the len of a in the test=8

函式引數傳遞是值傳遞,所以當陣列名作為函式引數的時候,其實傳入的是乙個指標,所以往往傳入陣列的同時會傳乙個長度。這一點需要特別小心。

陣列 陣列名 陣列位址

這裡取出的是整個陣列的位址。計算的是整個陣列的大小,單位是位元組。除此之外,遇到的所有的陣列名都表示陣列首元素的位址!一維陣列 int a printf d n sizeof a 16 這裡的陣列名a表示整個陣列,計算整個陣列的大小,也就是4個整數,整型佔4個位元組,所以整個陣列的大小是4 4 16...

陣列名,陣列首位址,a, a, a 0

1 指標陣列 是陣列,但陣列中的每個元素都是指標 int p 5 如p 2 是指標,可 p 2 3 2 指向陣列的指標 是個指標,但它指向的是乙個陣列 int a 5 int p 5 與前一行比較,p相當於a,即p a 就像 int m int pm pm就相當於m.pm m p a 可與前一行合併...

陣列名,陣列首位址,a, a, a 0

1 指標陣列 是陣列,但陣列中的每個元素都是指標 int p 5 如p 2 是指標,可 p 2 3 2 指向陣列的指標 是個指標,但它指向的是乙個陣列 int a 5 int p 5 與前一行比較,p相當於a,即p a 就像 int m int pm pm就相當於m.pm m p a 可與前一行合併...