先來看乙個例子,然後通過分析例子來學習
#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 可與前一行合併...