extern用於陣列和指標

2021-05-27 07:20:52 字數 637 閱讀 2028

檔案1(.h)

extern char p; (第一種寫法,正確)  

extern char* p; (第二種寫法,錯誤)

檔案2(.cpp)

char p[10];  

如呼叫p[i],則第二種寫法程式會崩潰.你可能會認為陣列名就是指標,為什麼會崩潰呢?

p在這裡被宣告為extern char* p,而它原來的定義卻是char p[10].這種情況,當用p[i]這種形式提取這個宣告的內容時,實際上得到的是乙個字元.但按照上面的方法,編譯器卻把它當成是乙個指標,把ascii字元解釋成為位址顯然牛頭不對馬嘴.如果此時程式當掉,你應該額手稱慶.否則的話,它很可能會汙染程式位址空間的內容,並在將來出現莫名其妙的錯誤.

上述解釋有些不容易理解,下面我詳細解釋下.

第一種寫法,呼叫p[i],編譯器符號表具有乙個位址x.執行時步驟1:取i值與x相加.執行時步驟2:取位址(x+i)的內容.

第二種寫法,呼叫p[i],編譯器符號表具有乙個p,位址為x,執行時步驟1:取位址x的內容,即y.執行時步驟2:取得i的值,並將它與y相加.執行時步驟3:取位址(y+i)的內容.

所以,第二種寫法,宣告的讀取方法,跟實際p的定義有差別.將檔案1,p[10]中的字元又解釋成指標,假設為m,然後使用m的內容,導致程式崩潰.

extern陣列與extern指標

陣列名代表了存放該陣列的那塊記憶體,它是這塊記憶體的首位址。這就說明了陣列名是乙個位址,而且,還是乙個不可修改的常量,完整地說,就是乙個位址常量。陣列名跟列舉常量一樣,都屬於符號常量。陣列名這個符號,就代表了那塊記憶體的首位址。注意了!不是陣列名這個符號的值是那塊記憶體的首位址,而是陣列名這個符號本...

extern陣列與extern指標

陣列名代表了存放該陣列的那塊記憶體,它是這塊記憶體的首位址。這就說明了陣列名是乙個位址,而且,還是乙個不可修改的常量,完整地說,就是乙個位址常量。陣列名跟列舉常量一樣,都屬於符號常量。陣列名這個符號,就代表了那塊記憶體的首位址。注意了!不是陣列名這個符號的值是那塊記憶體的首位址,而是陣列名這個符號本...

extern陣列與extern指標

extern陣列與extern指標 陣列名代表了存放該陣列的那塊記憶體,它是這塊記憶體的首位址。這就說明了陣列名是乙個位址,而且,還是乙個不可修改的常量,完整地說,就是乙個位址常量。陣列名跟列舉常量一樣,都屬於符號常量。陣列名這個符號,就代表了那塊記憶體的首位址。注意了!不是陣列名這個符號的值是那塊...