1、宣告和定義:
宣告相當於普通的宣告:它所說明的並非自身,而是描述其他地方的建立的物件。
定義相當於特殊的宣告:它為物件分配記憶體。
例如:定義:int my_array[100];
宣告:extern int my_array[ ];指代其他地方定義的物件。(二維陣列需要提供除最左邊一維之外的其他維的長度)
2、x = y;
1)符號x是x所代表的位址,符號y是y代表的位址的內容;
2)x是左值,y是右值;
3)左值在編譯時可知,左值表示儲存結果的地方,右值直到執行時才知,右值表示「y的內容」。
注:陣列名是左值,但不是可修改的左值,標準規定賦值符必須用可修改的左值作為它左邊一側的運算元。
3、當「以指標方式引用」時:
char *p ="abcdefgh";
當書寫了extern char *p,然後用 p[3] 來引用其中的元素時,編譯器將會:
1)取得符號表中 p 的位址,提取儲存於此處的指標。
2)把下標所表示的偏移量與指標相加,產生乙個位址。
3)訪問上面這個位址,取得字元。
編譯器已被告知p 是乙個指向字元的指標,(相反,陣列定義告訴編譯器 p 是乙個字串行)。
既然把p
宣告為指標,那麼不管p 原先是定義為指標還是陣列,都會按照上面的三個步驟進行操作,但是只有當
p原來定義為指標時這個方法才是正確的。
4、陣列和指標的其他區別:
指標陣列
儲存資料的位址
儲存資料
間接訪問資料,首先取得指標的內容,把它作為位址,然後從這個位址提取資料。
如果指標有乙個下標[ i ],就把指標的內容加 i 作為位址,從中提取資料。
直接訪問資料,a[ i ] 只是簡單的以 a + i為位址取得資料。
通常用於動態資料結構
通常用於儲存固定數目且資料型別相同的元素
相關的函式為 malloc(), free().
隱式分配和刪除
通常指向匿名資料
自身即為資料名
5、陣列和指標的定義:
1)定義指標時,編譯器並不為指標所指向的物件分配空間,它只是分配指標本身的空間,除非在定義時同時給指標乙個字串常量進行初始化,如:
char *p = "breadfruit"; (為字串常量分配了空間)
只有字串常量才如此,不會為浮點數之類的常量分配空間,如:
float *pip = 3.141; //編譯出錯
在ansi c中,初始化指標時所建立的字串常量被定義為唯讀。如果試圖通過指標修改這個字串的值,程式就會出現未定義的行為。
2)有字串常量初始化的陣列是可以修改的,如:
char a[ ] ="gooseberry";
strncpy(a, "black", 5);
陣列的值為「blackberry」。
C專家程式設計學習之第四章 陣列和指標
第四章 指標和陣列 宣告和定義的最主要區別 宣告並未非配記憶體,定義一定分配了記憶體。1 當我們在檔案1中,定義 int mango 100 在檔案2中 宣告 extern int mango 這是不對的,當你宣告為extern int mango時,編譯器理所當然認為mango是乙個指標,在檔案2...
第四章 陣列和指標
由於陣列和指標這部分知識比較深奧,本菜鳥決定將c和c 的指標部分的知識點全歸到c語言部分來整理,所以這裡就只總結一些題目。下列陣列的值是什麼?string sa 10 int ia 10 int main 解答 sa 和sa2 為元素型別為string 的陣列,自動呼叫string 類的預設建構函式...
第四章 陣列和指標
4.1 陣列 1 陣列的初始化 在函式體外定義的內建陣列,都初始化為0 在函式體內的內建陣列,均無初始化 顯示顯示初始化則可不必制定陣列的維數 初始化如果元素為類型別,則自動的條用該類預設的建構函式 2 特殊字元陣列 char ca c 會自動的在c 後新增乙個空的字元 o 而char ca2 ca...