1、
一般而言,陣列名代表了陣列本身,但如果把陣列名看做指標的話,它指向陣列的第乙個元素的位址。
例1:
int array[10]=;
int value;
value=array[0]; //也可寫成:value=*array;
value=array[1]; //也可寫成:value=*(array+1);
value=array[2]; //也可寫成:value=*(array+2);
例2:在 32 位系統中,
sizeof(int(*)[10]) //值為:4
sizeof(int[10]) //值為:40
sizeof(ptr) //值為:4
注意:sizeof(物件) 測出的都是物件自身的型別的大小
2、指標和陣列的特殊關係可以擴充套件到c-風格字串。字串相當於是乙個陣列,在記憶體中以陣列的形式儲存,只不過字串是乙個陣列常量,內容不可改變,且只能是右值.如果看成指標的話,他即是常量指標,也是指標常量。
例3:
char *str[3]=;
char s[80];
strcpy(s,str[0]); //也可寫成 strcpy(s,*str);
strcpy(s,str[1]); //也可寫成 strcpy(s,*(str+1));
strcpy(s,str[2]); //也可寫成 strcpy(s,*(str+2));
上例中,str 是乙個三單元的陣列,該陣列的每個單元都是乙個指標,這些指標各指向乙個字串。 把指標陣列名 str 當作乙個指標的話, 它指向陣列的第 0 號單元, 它的型別是 char **, 它指向的型別是 char *。
*str 也是乙個指標,它的型別是 char *,它所指向的型別是 char,它指向的位址是字串"hello,thisisasample!"的第乙個字元的位址, 即'h'的位址。
宣告乙個陣列的時候,編譯器會根據宣告指定的元素數量為陣列保留記憶體空間,並建立陣列名,此時陣列名是乙個指向該段記憶體空間的起始位置的常量。
宣告乙個指標變數的時候,編譯器只是為指標本事保留記憶體空間,並不為任何整型值分配記憶體空間
宣告了乙個陣列 type array[n],則陣列名稱 array 就有了兩重含義:第一,它代表整個陣列,它的型別是 type[n];第二,它是乙個常量指標, 該指標的型別是 type*, 該指標指向的型別是 type, 也就是陣列單元的型別, 該指標指向的記憶體區就是陣列第乙個元素, 該指標自己占有單獨的記憶體區, 注意它和陣列第乙個元素佔據的記憶體區是不同的。 該指標的值是不能修改的,即類似 array++ 的表示式是錯誤的。在不同的表示式中陣列名 array 可以扮演不同的角色。
在表示式 sizeof(array)中, 陣列名 array 代表陣列本身, 故這時sizeof 函式測出的是整個陣列的大小。在表示式 *array 中, array 扮演的是指標, 因此這個表示式的結果就是陣列第乙個元素的值。sizeof(*array)測出的是陣列單元的大小。
表示式 array+n(其中 n=0,1,2,.....)中,array 扮演的是指標,故 array+n 的結果是乙個指標,它的型別是 type *,它指向的型別是 type, 它指向陣列第 n 個元素。 故 sizeof(array+n)測出的是指標型別的大小。在 32 位系統中結果是 4。
5 3指標和陣列
定義乙個大小為10的陣列a 10 int a 10 包含了a 0 a 1 a 9 共計10個元素 定義指標 int pa pa指向陣列a的第0個元素,即pa為a 0 的位址。pa a 0 對陣列元素a i 的引用也可以寫為 a i 這樣的形式,這一點至少初看起來很令人吃驚。在求陣列元素a i 的值時...
(17)指標和陣列
在c 語言中,指標和陣列有非常緊密的聯絡,使用陣列的時候編譯器一般會把它轉換成指標。對陣列的元素使用取位址符就能得到指向該元素的指標。陣列有乙個特性 在多數用到陣列名字的地方,編譯器都會自動的將其替換為乙個指向陣列首元素的指標。當使用陣列作為乙個auto變數的初始值時,推斷得到的型別是指標而非陣列。...
12 指標和陣列
指標和陣列 不是陣列的專屬 注意 其實陣列就是指標,指標也是陣列 陣列名 include intmain 指向陣列首元素的指標 include intmain int argc,char argv int p null p指標變數指向首元素 p a 0 p a int i 0 for i 0 i 1...