1. 程式人生 > >數組變量與指針

數組變量與指針

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;
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 }
View Code

輸出:

技術分享圖片

技術分享圖片

可以看出來:

  • 數組變量符合指針的定義
  • 數組變量的值就是數組首元素的地址
  • 數組變量不可修改,類似於常量指針

其中不解的是

  • 用&取數組變量的地址,發現與數組首元素的值的地址相同,即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值不同

數組變量與指針