歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 數組名和指針的區別(數組名不是指針,是數組首地址)

數組名和指針的區別(數組名不是指針,是數組首地址)

日期:2017/3/1 9:05:57   编辑:Linux編程

聽了一堂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運算符時,數組名指代自身數組的全部元素的地址。

Copyright © Linux教程網 All Rights Reserved