1. 陣列和指標的宣告:
1. 指向整數的指標宣告:int *x;
2. 整數陣列宣告:int y[ ];
2. 如果把int mango[100]用int *mango來使用,就會發生型別不匹配錯誤(乙個是指標,乙個數陣列名)。
3. 宣告和定義:
1. 定義只能進行一次,只能出現在乙個地方。定義相當於特殊的宣告,它為物件分配記憶體。
2. 宣告可以多次出現。它所說的並非自身,而是描述其他地方的建立的物件。宣告中並沒有為陣列分配記憶體,所以並不需要提供關於陣列長度的資訊。對於多維陣列,需要提供除最左邊一維之外其他維的長度。
4. c語言要求表示式的左值是可以修改的,陣列名也用於確定物件在記憶體中的位置,也是可以修改的左值,但是它不能作為賦值的物件。陣列名是不可修改的左值。通俗的講,只能給可以修改的東西賦值。
5. 陣列名是一種符號,其位址在編譯時可知。如果編譯器需要乙個位址來執行某種操作,它就可以直接進行操作,而不需要增加指令首先取得具體的位址。但是對於指標,必須首先在執行時取得它的當前值,然後才能對它進行解除引用操作。這就是為什麼 char a[ ]和char a[100]等價的原因。這兩個宣告都提示a是乙個陣列,也就是乙個記憶體位址,陣列內的字元可以從這個位址找到。編譯器並不需要知道陣列總共有多長,因為它只產生偏離起始位址的偏移位址。
6. 定義為指標,可以按照陣列的方式引用,但是定義為陣列的變數不能按照指標的方式來引用。例如int *p, p[2]這種引用方式是合法的(首先獲得p指向的變數位址,然後在此基礎上加2。結果為將p宣告為陣列是下標為2的值),但是對宣告為陣列的變數指標引用是不合法的(會將陣列名作為指標尋得所指位址並在此基礎上加偏移量索引,有記憶體洩露和程式崩潰的風險)。
7. 陣列和指標的對比:
1. 指標儲存資料的位址。陣列儲存資料。
2. 指標間接訪問資料,首先取得指標的內容,把它作為位址,然後從這個位址提取資料,如果指標有乙個下標[i],就把指標的內容加上i作為位址,從中提取資料。陣列直接訪問資料,a[i]只是簡單地以a+i為位址取得資料。
3. 指標通常用於動態資料結構。陣列通常用於儲存固定數目且資料型別相同的元素。
4. 指標相關的函式有malloc( ),free( )。陣列隱式分配和刪除記憶體。
5. 指標通常指向匿名的資料。陣列自身即為資料名。
6. 用指標定義的字串常量不能被修改,陣列定義的字串常量可以被修改。
8. 所有作為函式引數的陣列名總是可以通過編譯器轉化為指標。
9. 對編譯器而言,乙個陣列就是乙個位址,乙個指標是位址的位址。
10. 下列情況下,對陣列的引用不能用指向該陣列第乙個元素的指標來代替:
1. 陣列作為sizeof( )函式的操作符。顯然此時需要的是整個陣列的大小,而不是指標所指向的第乙個元素的大小。
2. 使用&操作符取陣列的位址。
3. 陣列是乙個字串(或寬字串)常量初始值。
11. 什麼時候陣列和指標是相同的:
1. 表示式中的陣列名(與宣告不同)被編譯器當做乙個指向該陣列第乙個元素的指標。例:int a[10], *p, i =2。下面的三種方式都可以訪問a[i]:
1. p=a; p[i];
2. p=a;*(p+i);
3. p=a+i;*p;
2. 下標總是與指標的偏移量相同。指標和偏移量是底層硬體所使用的基本模型,但是在處理一維陣列的時候,指標並不見得比陣列快。指標和陣列的同等實現:
C語言 指標陣列和指標陣列
本質是陣列 只不過呢,它裡面存放的資料型別不是int,也不是char這類基本型別,而是乙個指標型別,說白了就是位址,所以叫指標陣列!記住 是存放指標的陣列!int p n 本質是指標 只不過是指向乙個陣列的指標,也稱之為 行指標 int p n p是乙個指標,指向乙個int型別的一位陣列,這個一位陣...
c語言 陣列和指標
指標可以理解為乙個變數,是乙個專門用來存放位址的變數。int ptr null 整型指標,內容為空。char ptr null char型指標,內容為空。float ptr null 浮點型指標,內容為空。可如下使用 int a 10 int ptr a char指標解引用只能訪問乙個位元組大小,而...
C語言 陣列和指標
陣列有一系列相同的元素構成。使用陣列宣告來告訴編譯器需要乙個陣列。數值宣告包括陣列元素的數目和元素的型別。要訪問陣列中的元素可以使用下標 index 來表示單個元素,index是從0開始計數的。陣列的初始化 比如days 12 如果陣列沒有初始化 比如int no data 4 當列印出陣列元素時,...