C語言 指標與陣列

2021-09-24 23:04:29 字數 1956 閱讀 4175

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.兩個指標相加減 兩指標必須指向同一變數!否則運算沒有意義的...