數組變量與指針
阿新 • • 發佈:2018-12-06
bubuko 必須 圖片 play () 數值 應該 總結 發現
背景:完全的C初學者。。試圖搞清楚數組的概念,做了一些小試驗,查了一些解釋,合成此文。
我們說數組變量相當於常量指針,那麽實際它就是常量指針名嗎?
簡單試驗:
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;View Code9 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 }
輸出:
可以看出來:
- 數組變量符合指針的定義
- 數組變量的值就是數組首元素的地址
- 數組變量不可修改,類似於常量指針
其中不解的是
- 用&取數組變量的地址,發現與數組首元素的值的地址相同,即s與&s的值相同。
- 如果數組變量就是指針的話,那麽數組變量的值為其首元素的地址,而它自己不應該放在另一個地址嗎?(就像上面的指針變量p一樣)
於是,查閱了一下,這個問題大致是這樣理解的
-
arr 本身是左值(但不可僅憑此表達式修改),指代數組對象。不過 arr 會在大多數場合隱式轉換成右值表達式 &(arr[0]) 。為指針類型,指向 arr[0] 。
&arr 是右值表達式,為指針類型,指向 arr 本身。簡單來說就是 arr 本身不是地址而是指代整個數組,只不過會隱式轉成指針罷了。arr (轉換後)和 &arr 類型不同,數值相等是因為 arr 和 arr[0] 地址相同,這裏地址指首地址。【轉自知乎-暮無井見鈴】
另有一份總結:
- 數組地址與數組名:
- 數組名代表數組首元素的地址(a);
- 數組的地址需要用取地址符&才能得到(&a);
- 數組首元素的地址值與數組的地址值相同
- 數組首元素的地址與數組的地址是兩個不同的概念
- 數組名的盲點:
- 數組名可以看做一個常量指針;
- 數組名“指向”的是內存中數組首元素的起始位置;
- 在表達式中數組名只能作為右值使用下
- 下列場合中數組名不能看做常量指針:
- 數組名作為sizeof操作符的參數;
- 數組名作為&運算符的參數
驗證s與&s類別不同:
s與&s值相同,但s+1與&s+1值不同
數組變量與指針