1.陣列名:陣列名的值是乙個指標常量,也就是第乙個陣列元素的位址。這裡需要注意的是指標常量。編譯器用陣列名記錄陣列的資訊(陣列元素的個數等),只有在表示式中使用陣列名才會產生乙個指標常量。只存在兩個特列:(1)sizeof(),返回的是陣列的長度;(2)取位址操作符&,返回的是乙個指向陣列的指標.
int array[5] = ;
int *p = array;
int *parray = &array;//區別在於p是陣列array第乙個元素的位址,而*parray是陣列array的位址
//若p 的值為 p = 0x804a014
// parray = 0x804a014
// p + 1 = 0x804a018
// parray + 1 = 0x804a028
2.下標的使用:c的下標與間接訪問表示式一樣,在任何使用下標引用的地方都可以使用對等的指標表示式來代替。
*(b + 3);//其中b是乙個指向整型的指標,所以b+3指向另乙個整型的指標,他所指向的是陣列第乙個元素向後移3個整數長度的位置。
int array[10];
int *ap = array +2;
則//ap,即為array+2,與&array[2]等價
//*ap,即為array[2]
//ap[0] ;貌似ap不是乙個指標,其實這麼想是錯誤的,c的下標引用與間接訪問表示式是一樣的,在這種情況下等價於*(ap + (0));
下面這段**剛好可以解釋上述問題
int main()
; int* p = array;
printf("*(p+2) = %d\narray[2] = %d\n(p+2)[2] = %d\n", *(p + 2), array[2], (p + 2)[2]);
printf("p = %p\np + 1 = %p\n&array = %p\n&array + 1 = %p\n", p,p+1,&array,&array+1);
getchar();
return 0;
}
名稱值型別
備註*(p + 2)
3 int
等價於array[2]
array[2]
3 int
(p + 2)[2]
5int
等價於array[5]
p 0x0097f7f4
int *
array[0]的位址,是乙個int型指標
p+10x0097f7f8
int *
array[1]的位址,是乙個int型指標
&array
0x0097f7f4
int[5] *
&array代表的是陣列指標,
&array+1
0x0097f808
int[5] *
因此,&array+1表示向後移動5個int型位元組
效率:陣列與指標的效率問題
//**段1
int array[10],a;
for(a = 0; a < 10; a += 1)
array[a] = 0;
//**段2
int array[10],*ap;
for(ap = array; ap < array; ap++)
*ap = 0;
指標的效率不低於陣列,陣列的效率不高於指標。如上述**段1因為陣列取元素是用下標乘以型別長度,執行的乘法運算,較為耗時;**段2,迴圈中,執行乘法運算的都是1*4,結果這個乘法就在編譯時執行過一次,——程式現在包含一條指令,把4與指標相加,而在執行時不執行乘法運算。因此在這種情況下指標效率比陣列高。 C語言指標陣列與陣列指標
初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...
C語言指標 指標與陣列
1 指標與一維陣列 2 指標與二維陣列 3 指標陣列與陣列指標 指標裡面最難的一種就是指標與陣列了,對於指標和二維陣列來說這裡面的關係比較複雜。牽涉到編譯器的原理和編譯過程。1 指標與一維陣列 指標是指向乙個記憶體的位址,一維陣列的陣列名代表一塊記憶體 這個陣列 的首位址,和陣列首元素的位址一樣,但...
C語言指標 指標與陣列
一 指標的運算 指標可以進行三種運算 1.指標加上整數 如果指標p指向陣列a i 那麼指標p j 指向a i j 前提是a i j 存在!2.指標減去整數 如果指標p指向陣列a i 那麼指標p j 指向a i j 前提 a i j 存在!3.兩個指標相加減 兩指標必須指向同一變數!否則運算沒有意義的...