當我們在呼叫函式時,傳遞陣列,就是把陣列首元素的位址傳遞給函式,本質也就是給函式傳遞了乙個指標變數。這時候我們會想那麼陣列是不是跟指標是一樣的。為了驗證,我們可以給乙個專案裡建立乙個新的原始檔,裡面建立乙個指標變數和是個陣列,然後在另乙個檔案中用陣列的方法宣告指標,在用指標的方法宣告這個陣列進行除錯,看下結果會如何。
我們建立乙個test.c檔案用來編寫主函式,test1.c建立變數編寫內容如下:
test.c:
#include extern char*arr;
extern char p;
int main()
test1.c:
char arr = "hello world";
char *p = "hahahahahaha
我們執行這個工程會怎麼樣呢,答案是當程式走到第乙個printf時是會崩潰掉的,原因是我們在test1.c中定義的是乙個陣列,卻在test.c中用指標宣告引用,那麼在*arr這個指標中存放的內容其實是
"hello world",這個字串,指標能存放字串嗎?答案當然是不可以的,指標只能存放乙個位址,當你放進去乙個字串,自然會在執行的時候發生記憶體錯誤。那麼第二個printf輸出的是不是hahahahahaha呢,其實也不是,第二個printf單獨拿出來雖然可以正常執行,但是他的結果絕對不是我們想要的內容,其結果如下:
是個亂碼,這是因為我們輸出的時候,拿到的是位址,把位址放到乙個char型別的字串裡,等於把乙個位址通過字元型別輸出來了,自然是亂碼。
這裡我們便清楚地看到了指標和陣列的差別了吧。那如果想正常輸出我們應該怎麼辦,做法如下:
test.c
#include extern char*arr;
extern char p;
int main()
結果如下:
對於第乙個,我們接收到的是乙個指標,裡面存放的卻是一乙個字串,所以我們可以直接去arr的位址,然後強制型別轉換為乙個char型的指標變數進行輸出。
第二個接收到的是乙個位址,我們知道位址所佔位元組是和int*型別所佔位元組是相等的,所以我們先把他轉換成int*型別,然後解運用,拿到這個陣列的內容(位址),把這個位址咱轉換為char*型,這樣我們就能用printf輸出這個內容了。
這個例子足以證明指標和陣列的區別,指標的內容僅僅是個位址,而陣列是個個資料的集合,他裡面可以是位址(指標),也可以是其他型別的元素,而陣列的位址其實也就個指標。所以說陣列和指標其實有著本質的區別。希望大家注意。
(完)如有不足或者錯誤之處,希望批評指正。
本文出自 「pawnsir的it之路」 部落格,請務必保留此出處
8 3 宣告符的含義
1 宣告符列表出現在可選的 第7章 decl specifier seq 7.1 之後。每個宣告符只能包含乙個 declarator id 它對被宣告的識別符號進行命名。除了特殊函式 12.3,12.4,13.5 宣告 模板特化或區域性特化 14.7 宣告之外,declarator id 中的unq...
近況的一點宣告
工作兩年多了,可以說生活,技術,職業發展,人際交往等等各個方面都有不少的感悟,但blog上就是沒積累記錄下來。主要原因有兩個 解釋下第二個原因。一直覺得既然寫就寫好,小感悟零零碎碎的知識不足以匯集成像樣的總結,一句兩句三五句話的文章個人覺得實在沒必要。寫起來沒勁,各位看官看起來也沒意思。這方面過於追...
指標陣列和陣列指標 和 指標和陣列的定義與宣告
舉個栗子來區分以下指標陣列和陣列指標 int arr1 10 是指標陣列,arr1和 的結合性更高一些,所以arr1先與 結合成為陣列,陣列有10個元素,每個元素的型別都為int 型,所以 int arr1 10 是存放整型指標的陣列。int p 10 是陣列指標,p先與 結合,說明p是乙個指標變數...