前段時間,聽了一堂C語言的課,那老師說:“數組名就是一個指向數組首地址的常量指針”。 我上百度查了一些,有好多教程、書籍等,都持相同的觀點。 但我一直感覺——數組名不等於指針。 實踐是檢驗真理的唯一標準,於此,有了以下內容。 首先,聲明一個數組和一個常量指針並指向那個數組。 設問:一個整型指針的長度 ...
前段時間,聽了一堂C語言的課,那老師說:“數組名就是一個指向數組首地址的常量指針”。
我上百度查了一些,有好多教程、書籍等,都持相同的觀點。
但我一直感覺——數組名不等於指針。
實踐是檢驗真理的唯一標準,於此,有了以下內容。
首先,聲明一個數組和一個常量指針並指向那個數組。
1 int arr[3] = { 1, 2, 3 }; //聲明數組 2 const int *p_arr = arr; //聲明常量指針
設問:一個整型指針的長度為4Byte,比較數組名的數據長度和指針的數據長度是否相等?
printf("*p_arr的長度=%d,arr的長度=%d\n", sizeof(p_arr),sizeof(arr));
運行結果:p_arr的長度=4,arr的長度=12
結論:數組名應該不是指針。
設問:數組名不能作為左值,那常量指針呢?
p_arr = p_arr;
運行結果:不報錯
arr = arr;
運行結果:報錯——“=”做操作數必須左值 and 表達式必須是可修改的左值。
const int *p_arr = &arr[0]; //重新聲明一個,指向數組首地址
printf("p_arr的地址=%p,arr的地址=%p\n", &p_arr, &arr);
運行結果:p_arr的地址=002DF958,arr的地址=002DF964。
結論:數組名不是常量指針,更不是指向數組首地址的常量指針。
設問:常量指針能為左值,那常量呢?
1 const int a = 3; 2 a = a;
運行結果:報錯——“a”不能給常量賦值 and 表達式必須是可修改的左值。
結論:常量指針不是一個常量。
設問:數組名是一個常量嗎?
printf("3的地址=%p,arr的地址=%p\n", &3, &arr);
運行結果:報錯——常量上的“&” and 表達式必須為左值或者函數提示符。(數組名存在地址,而常量不存在)
#define B 5 printf("B的地址=%p,arr的地址=%p\n", &B, &arr);
運行結果:報錯——常量上的“&” and 表達式必須為左值或者函數提示符。(與上一致)
printf("a的地址=%p,arr的地址=%p\n", &a, &arr); //a是之前用const聲明過的常量
運行結果:能正常運行,說明a和arr都有自己的存儲空間。
1 a = arr[0]; //因為arr=arr[0],現在那arr[0]的值賦給a 2 printf("a的地址=%p,arr的地址=%p\n", &a, &arr);
運行結果:a的地址=0041F7FC,arr的地址=0041F814(二者不在同一塊記憶體單元中)
結論:數組名不是一個常量,也不是一個用const限定變數所形成的常量。
設問:數組名是否完成等同於數組首地址?
&arr[0] = &arr[0];
運行結果:報錯——“=”做操作數必須左值 and 表達式必須是可修改的左值。(和arr = arr;的結果一致)
printf("arr[0]的地址=%p,arr的地址=%p\n", &arr[0], &arr);
運行結果:arr[0]的地址=002FFA34,arr的地址=002FFA34。(地址完全相等)
printf("&arr的長度=%d,arr的長度=%d\n", sizeof(&arr[0]), sizeof(arr));
運行結果:&arr的長度=4,arr的長度=12。
結論:數組名應該就是數組首地址,只是當在使用sizeof運算符時,可能進行了隱式轉換。(轉換指代整個數組,既sizeof(arr)=數組中元素的個數 乘以 sizeof(arr[0])的值)
最後的結論:暫且認為數組名在一般情況下就是該數組的首地址,在使用sizeof運算符時,數組名指代自身數組的全部元素的地址。