指標和陣列(第五節 定義與宣告)

2021-07-25 06:17:43 字數 1020 閱讀 2212

檔案1中定義如下:chara[100];

檔案2中宣告如下:externchar*a; (關於extern的用法,以及定義和宣告的區別,請複習第一章)

這裡,檔案1中定義了陣列a,檔案2中宣告它為指標。這有什麼問題嗎?平時不是總說陣列與指標相似,甚至可以通用嗎?但是,很不幸,這是錯誤的。通過上面的分析我們也能明白一些,但是「革命尚未成功,同志仍需努力」。你或許還記得我上面說過的話:陣列就是陣列,指標就是指標,它們是完全不同的兩碼事!他們之間沒有任何關係,只是經常穿著相似的衣服來迷惑你罷了。下面就來分析分析這個問題:

在第一章的開始,我就強調了定義和宣告之間的區別,定義分配的記憶體,而宣告沒有。定義只能出現一次,而宣告可以出現多次。這裡extern告訴編譯器a這個名字已經在別的檔案中被定義了,下面的**使用的名字a是別的檔案定義的。再回顧到前面對於左值和右值的討論,我們知道如果編譯器需要某個位址(可能還需要加上偏移量)來執行某種操作的話,它就可以直接通過開鎖動作(使用「*」這把鑰匙)來讀或者寫這個位址上的記憶體,並不需要先去找到儲存這個位址的地方。相反,對於指標而言,必須先去找到儲存這個位址的地方,取出這個位址值然後對這個位址進行開鎖(使用「*」這把鑰匙)

這就是為什麼externchara與externchara[100]等價的原因。因為這只是宣告,不分配空間,所以編譯器無需知道這個陣列有多少個元素。這兩個宣告都告訴編譯器a是在別的檔案中被定義的乙個陣列,a同時代表著陣列a的首元素的首位址,也就是這塊記憶體的起始位址。陣列內地任何元素的的位址都只需要知道這個位址就可以計算出來。

但是,當你宣告為externchar*a時,編譯器理所當然的認為a是乙個指標變數,在32位系統下,佔4個byte。這4個byte裡儲存了乙個位址,這個位址上存的是字元型別資料。雖然在檔案1中,編譯器知道a是乙個陣列,但是在檔案2中,編譯器並不知道這點。大多數編譯器是按檔案分別編譯的,編譯器只按照本檔案中宣告的型別來處理。所以,雖然a實際大小為100個byte,但是在檔案2中,編譯器認為a只佔4個byte。

我們說過,編譯器會把存在指標變數中的任何資料當作位址來處理。所以,如果需要訪問這些字元型別資料,我們必須先從指標變數a中取出其儲存的位址

函式第五節

coding utf 8 1.定義乙個func name 該函式效果如下。assert func lilei lilei assert func hanmeimei hanmeimei assert func hanmeimei hanmeimei def title name if isinsta...

第五節 字典

字典的表現形式為大括號 dict key必須可hash,必須唯一且必須為不可改變的資料型別 value可存放任意多個值,可修改,可不唯一 無序且查詢速度快 鍵 值 鍵值對 1 dic.keys 返回乙個包含字典所有key的列表 2 dic.values 返回乙個包含字典所有value的列表 3 di...

第五節 列表(list)

lpush listname value lpush 命令將乙個或多個值插入到列表頭部。lpush newlist valuea valueb lindex listname index 佇列從做往右,索引從0開始。隊頭在左邊,新插入的元素就是索引為0的元素。你也可以使用負數下標,以 1 表示列表的...