1. 程式人生 > >陣列名與指標“沒關係”

陣列名與指標“沒關係”

一、陣列名是指標嗎?

在C語言基礎書上我們看到過"我們可以把地址,形象的看成指標",所以地址就是指標,指標就是地址,這句話在某種程度上應該沒一點問題。但是我們也老是聽別人說"陣列名就是首元素的地址",所以我們就類比,陣列名 = 地址,又因為 地址 = 指標,所以陣列名 = 指標,如果你真的這樣理解,認為陣列名就是指標的話,那你就大錯特錯,所以"陣列名就是首元素的地址" 這句話是有一定的條件的,下面我來解釋,為什麼陣列名不是指標?

首先應該清楚陣列名含義:1. 陣列名就是陣列名就是這個陣列的名稱,代表整個陣列空間2.在某種程度上可以看成指標(剛剛才說了陣列名不是指標嗎?這裡又說它是指標?別急 這裡需要明白一個概念"左值和右值")

擴充套件: 左值和右值:假如 x= y ,顧名思義=左邊就是左值 ,=右邊就是右值。

左值:編譯器認為x的含義是x所代表的地址,這個地址只有編譯器知道,在編譯的時候確定,編譯器在一個特定的區域來儲存這個地址,我們不必考慮這個地址到底儲存到哪了。

右值:編譯器認為y的含義是y所代表的地址裡面的內容,這個內容是什麼,只有執行的時候才知道。

這裡又引出一個概念"表示式必須是可修改的左值",因為 = 是一個賦值號,所以左值必須是一個變數,你不能給一個常量進行賦值;

陣列名作為左值的時候被初始化前它的地址就是不確定,編譯器為其隨機分配地址,但是陣列一旦被初始化,陣列名就是一個值,只不過這個值是首元素的地址,但它萬萬不能等於指標;

陣列名作為右值的時候,因為他是確定的值,arr = & arr[0]所以此時可以把陣列名看做指標,也就是說一定條件下陣列名可以看成指標;

如果你單純的說陣列名就是指標這種說法是片面的,是錯誤的,但是陣列名在為右值的時候可以看出指標,此時可以說陣列名的值是指標。

還有我們都知道如果是指標的話指標求大小,即sizeof(指標)應該等於4,而事實上sizeof(arr) 等於40,即整個陣列的大小

因此,陣列名不是指標,永遠也不是,但在一定條件下,陣列名可以轉換為指標。

二、為什麼會出現三值合一?

我們先來看一個現象

arr = &arr =&arr[0] = 0xbbfc00 ,我們可以很清楚的看到 arr 、&arr、&arr[0]三值合一, &arr[0],我們好理解就是陣列首元素的地址,但是陣列名的值和 陣列名的地址為什麼又是同一個值呢?

此時我們就可以解釋當我們列印&arr[0]、 arr 、 &arr 為什麼三值合一:

&arr[0] 代表的是陣列中首元素的地址;

arr 陣列名代表整個陣列空間,但是當arr作為右值的時候,arr 與&arr[0]沒有本質差別,都代表陣列的的首元素的地址,而不是整個陣列的首元素地址;

&arr 代表的是對整個陣列進行取地址,而整個陣列只要告訴我們首地址,我們就可以只知道其大小多大,因為定義陣列的時候我們知道其型別佔幾個位元組裡面有多少個元素,所以就可以求出其大小,所以我們給整個陣列取地址,就是給整個陣列首元素取地址

所以他們三值合一也就不足為奇了!!!

三、陣列名是常量?

答:陣列名就是常量。

當陣列名在初始化的時候,它是變數(左值必須是變數),它的地址由編譯器隨機分配給我們,一旦被定義了,陣列名就是常量,陣列名作為右值時候陣列名的值就是首元素的地址。


四:指標與陣列的關係

沒關係

指標就是指標,用來存放地址,佔四個位元組(32位編譯器),系統分配空間。陣列就是陣列用來存放同一型別資料,系統不會分配空間,只是他兩經常穿著相似的衣服逗你玩罷了(只不過陣列名的值有時候可以當做指標來操作而已)。。。