細談陣列指標

2021-10-09 19:14:24 字數 1504 閱讀 2127

陣列指標,指標陣列是學習指標和陣列最讓人頭疼的名詞,下面是學習分享,不足之處,望指正,相互學習!

直接上**

//以下是在32位作業系統中編譯執行

#include

void main(void)

int array[3][4]=,,};  //定義乙個指向int型的array二維陣列

int (*ptr)[4]=null;//定義乙個指向占有4個元素的陣列指標ptr

int *ptr1=null,*ptr2=null,*ptr3=null;//定義三個int型指標並初始化為null

ptr=array;

ptr1=(int *)array;

ptr2=array[0];

ptr3=&array[0][0];

printf("\narray=%p",array);

printf("\nptr=%p\tptr+1=%p",ptr,ptr+1);

printf("\nptr1=%p\tptr1+1=%p",ptr1,ptr1+1);

printf("\nptr2=%p\tptr2+1=%p",ptr2,ptr2+1);

printf("\nptr3=%p\tptr3+1=%p",ptr3,ptr3+1);

編譯執行後的結果如下:

1.array是乙個二級指標,指向array[0],array[0]佔16個位元組的陣列,因此array+1,則以array[0]為基位址向後移16個位元組。

2. ptr在宣告時,是乙個指向四個元素的陣列指標,當ptr指向array時,ptr仍是乙個指向四個元素的陣列指標,因此,指向array時,以array[0]為基準,向後移16個位元組,不妨將ptr宣告為(int *ptr)[3],ptr=array,假設可以編譯執行,那麼ptr+1,則是以array[0]為基位址向後移12個位元組。

3. ptr1宣告乙個指向int型的指標且指向null,這是宣告指標時需要記住的,為什麼ptr=(int *)array,因為要保證指標指向的維數一致,否則編譯器會提示warning。這樣寫是將array強制轉換為指向int型的指標,我們知道指標佔乙個位元組,因此ptr1+1以arra[0]為基位址向後移動4個位元組。

4.ptr2指向array[0],大家會誤認為,ptr2應該跟array[0]一樣,指向佔4個元素的陣列指標,其實類似於ptr1,ptr2也只是乙個指向int型的指標,因此,ptr2+1是以array[0]為基位址向後移動4個位元組。

5.ptr3取的array第乙個元素的位址,也是array的首位址,但ptr3同時也是乙個指向int 型的指標,那ptr3+1以array[0][0]為基位址向後移動4個位元組。

可能有些人會納悶,那如果ptr1或者ptr2,亦或者ptr3是乙個指向short型的指標呢,其它的賦值操作不便,那麼ptr1+1,ptr2+1,ptr3+1指向的位址又會是什麼呢?有興趣的可以自己手動編譯執行下。其結果均是以array[0]為基位址向後移動2個位元組。

細談C 中的智慧型指標

指標是c 語言的靈魂,也就是說想學好c 就必須學好指標的用法。指標的靈活性給c 程式插上了一雙翅膀,使c 程式設計師可以編寫出更加飄逸的 但隨之而來的則是令人煩躁的記憶體管理。在使用指標時,記憶體洩露的問題一直困擾著c 程式設計師。智慧型指標的出現使得記憶體洩露這一棘手的問題得到了相當程度的緩解。智...

陣列,指標,指標陣列,陣列指標

指標是在32位系統下佔四個位元組,64位系統下佔八個位元組的一種型別,指標指向的內容可以是常量,變數,函式,結構體,指標本身,陣列,等等.一級指標 一級指標常常在函式傳參時使用,可傳的引數有一維陣列,常量指標,函式指標等等都可以 但我們要注意不要在函式中,通過改變形參的指向來達到改變實參指向的效果,...

指標, 指標的指標, 陣列, 指標陣列, 陣列指標

指標 int a 10 int p a 指標的指標 int b 20 int p b int p2p p 簡單陣列 int c 10 整數陣列,含有10個整數元素 也就是說每乙個元素都是整數 指標陣列 int p 10 指標陣列,含有10個指標元素 也就是說每乙個元素都是指標 陣列指標 int p ...