背景:徹底的C初學者。。試圖搞清楚數組的概念,作了一些小試驗,查了一些解釋,合成此文。數組
咱們說數組變量至關於常量指針,那麼實際它就是常量指針名嗎?ide
簡單試驗:spa
1 #include <stdio.h> 2 3 int main() { 4 int a; //聲明int變量 5 printf("變量的地址:%p\n",&a); //聲明變量時,申請內存地址 6 printf("變量佔位:%d\n",sizeof(a)); //根據類型決定分配空間 7 // printf("變量的值:%d\n",a); //報錯,由於沒有放入值 8 a = 9; 9 printf("變量的值:%d\n\n",a); 10 11 12 int *p; //聲明指針變量 13 printf("指針變量的地址:%p\n",&p); 14 printf("指針變量佔位:%d\n",sizeof(p)); 15 // printf("指針變量指向:%d\n",*p); //報錯,由於沒有放入值 16 p = &a; 17 printf("指針變量的值:%p\n",p); 18 printf("指針變量指向:%d\n\n",*p); 19 20 21 int s[4]={5}; //聲明數組變量 22 printf("數組變量的地址:%p\n",&s); 23 printf("數組變量的地址+1:%p\n",&s+1); 24 printf("數組變的地址佔位:%d\n",sizeof(&s)); //sizeof(地址) 25 printf("數組變量的值:%p\n",s); //數組變量的值的本身的地址!是一個特殊的指針! 26 printf("數組變量的值+1:%p\n",s+1); 27 printf("數組變佔位:%d\n",sizeof(s)); //sizeof(地址)? 28 29 30 printf("數組變量首元素的地址:%p\n",&s[0]); //s和s[0]地址相同! 31 printf("數組變量次元素的地址:%p\n",&s[1]); //數組是變量的容器 32 printf("取數組首元素:%d\n",s[0]); 33 printf("對數組變量解指針操做:%d\n",*s); //s指向的東西就是s[0]! 34 printf("數組元素佔位:%d\n\n",sizeof(s[0])); 35 36 37 38 //指針變量和數組變量互相s賦值 39 int b=88; 40 int *const p2=&b; //常量指針必須在聲明的時候初始化! 41 p = s; //能夠改變指針p的值 42 // p2 = p; //常量指針不可修改! 43 // s = &b; //數組變量不可修改! 44 int s2[5]; 45 printf("數組變量s2的地址:%p\n",&s); 46 printf("數組變量的值:%p\n",s); //地址相同?? 47 // s2 = s; //數組變量不可修改! 48 49 return 0; 50 }
輸出:3d
能夠看出來:指針
其中不解的是code
因而,查閱了一下,這個問題大體是這樣理解的對象
arr 自己是左值(但不可僅憑此表達式修改),指代數組對象。不過 arr 會在大多數場合隱式轉換成右值表達式 &(arr[0]) 。爲指針類型,指向 arr[0] 。
&arr 是右值表達式,爲指針類型,指向 arr 自己。簡單來講就是 arr 自己不是地址而是指代整個數組,只不過會隱式轉成指針罷了。arr (轉換後)和 &arr 類型不一樣,數值相等是由於 arr 和 arr[0] 地址相同,這裏地址指首地址。C做爲實用語言,爲了使用方便而進行隱式類型轉換。【參考知乎-暮無井見鈴】blog
另有一份總結:內存
驗證s與&s類別不一樣:get
s與&s值相同,但s+1與&s+1值不一樣