指標陣列:首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是「儲存指標的陣列」的簡稱。
陣列指標:首先它是乙個指標,它指向乙個陣列。在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 繼續來看看位址之間的關係
[cpp]view plain
copy
?intmain()
; int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int)a+1);
printf(」%x,%x」,ptr1[-1],*ptr2);
return 0;
}
intmain()
; 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 的內容。
其記憶體布局如下圖:
第一章講解union 關鍵字時已經詳細討論過了,請翻到彼處參看,這裡就不再詳述。我們可以用下面這個函式來測試當前系統的模式。
[cpp]view plain
copy
?int checksystem( )
c;
c.i = 1;
return (c.ch ==1);
} 如果當前系統為大端模式這個函式返回0;如果為小端模式,函式返回1。也就是說如果此函式的返回值為1 的話,*ptr2 的值為0x2000000。如果此函式的返回值為0 的話,*ptr2 的值為0x100
int checksystem( )
c;c.i = 1;
return (c.ch ==1);
}如果當前系統為大端模式這個函式返回0;如果為小端模式,函式返回1。也就是說如果此函式的返回值為1 的話,*ptr2 的值為0x2000000。如果此函式的返回值為0 的話,*ptr2 的值為0x100
**: 指標和陣列的關係
指標和陣列的關係 參考朱有鵬c語言大講堂 1 指標和陣列的型別匹配的問題 int p int a 5 p a 型別的匹配的問題 p a a和a的數值是一樣的,但是 a時表示整個陣列的大小的 位址的列印是一樣的。a a a 0 從數值上看是完全一樣的,從意義上面看,a和 a是整個陣列的首位址,從型別來...
指標和陣列關係初探
指標是c語言中的精髓。高質量c 程式設計指南 的作者林銳就曾說過 不會正確使用指標,肯定算不上是合格的程式設計師。昨晚我思考了一宿,自認找到了理解指標的正確途徑。本文試圖通過 指標和陣列的關係去研究指標。一般的c語言教科書上都會有這樣的話 指標就是位址,陣列名就是指標的首位址。這些不能不說是錯誤的,...
指標和陣列的關係
陣列名是乙個指標常量,表示陣列第乙個元素的的起始位址。如 int a 5 a表示陣列第乙個元素a 0 的起始位址 a 0 一 引用陣列元素的方法 用陣列下標引用陣列元素 陣列a中元素用下標表示為 a 0 a 1 a 2 a 3 a 4 用指標引用陣列元素 陣列a中元素用下標表示為 int p a p...