c/c++(疑4) 指標數組和數組指標之間關係,指標數組
1 指標數組和數組指標概述(數組指標(指向數組的指標)與指標數組(存放指標的數組))
指標數組:首先它是一個數組,數組的元素都是指標,數組佔多少個位元組由數組本身決定。它是“儲存指標的數組”的簡稱。
數組指標:首先它是一個指標,它指向一個數組。在32 位系統下永遠是佔4 個位元組,至於它指向的數組佔多少位元組,不知道。它是“指向數組的指標”的簡稱。
認識指標數組和數組指標從記憶體方面分析
1 int *ptr1[10];2 int (*ptr2)[10];
要分析上面的問題,我希望你知道符號之間的優先順序(C語言入門教程)也會分析這些基礎,而又實用的知識。 這個地方就直接說明:[]”的優先順序比“*”要高
*****Ok 有了上面的基礎就可以開始分析
ptr1先與“[]”結合,構成一個數組的定義,數組名為ptr1,int *修飾的是數組的內容,即數組的每個元素。那現在我們清楚,這是一個數組,其包含10個指向int 類型資料的指標,即指標數組。至於ptr2就更好理解了,在這裡“()”的優先順序比“[]”高,“*”號和ptr2 構成一個指標的定義,指標變數名為ptr2,int 修飾的是數組的內容,即數組的每個元素。數組在這裡並沒有名字,是個匿名數組。那現在我們清楚ptr2 是一個指標,它指向一個包含10個int 類型資料的數組,即數組指標。
***** 繼續來使用記憶體來分析
2 繼續來看看地址之間的關係
intmain() { int a[4]={1,2,3,4}; int *ptr1=(int *)(&a+1); int *ptr2=(int *)((int)a+1); printf("%x,%x",ptr1[-1],*ptr2); return 0; }
ptr1:將&a+1 的值強制轉換成int*類型,賦值給int* 類型的變數ptr,ptr1 肯定指到數組a 的下一個int 類型資料了。ptr1[-1]被解析成*(ptr1-1),即ptr1 往後退4 個byte。所以其值為0x4。
ptr2:按照上面的講解,(int)a+1 的值是元素a[0]的第二個位元組的地址。然後把這個地址強制轉換成int*類型的值賦給ptr2,也就是說*ptr2 的值應該為元素a[0]的第二個位元組開始的連續4 個byte 的內容。
其記憶體布局如:
好,問題就來了,這連續4 個byte 裡到底存了什麼東西呢?也就是說元素a[0],a[1]裡面的值到底怎麼儲存的。這就涉及到系統的大小端模式了,如果懂彙編的話,這根本就不是問題。既然不知道當前系統是什麼模式,那就得想辦法測試。大小端模式與測試的方法在第一章講解union 關鍵字時已經詳細討論過了,請翻到彼處參看,這裡就不再詳述。我們可以用下面這個函數來測試當前系統的模式。
int checkSystem( ) { union check { int i; char ch; } c; c.i = 1; return (c.ch ==1); }如果當前系統為大端模式這個函數返回0;如果為小端模式,函數返回1。也就是說如果此函數的傳回值為1 的話,*ptr2 的值為0x2000000。如果此函數的傳回值為0 的話,*ptr2 的值為0x100