1樓:
是這樣的。
詳情請看: http://www.
在進入主題前,我們先看乙個例子:
#include
int main()
;int *ptr = (int *) (&a + 1);
printf("%d,%d\n", *(a + 1), *(ptr - 1));
return 0;
}列印出來的值是多少呢?結果:2,5具體分析:
對指標進行加1 操作,得到的是下乙個元素的位址,而不是原有位址值直接加1。
所以,乙個型別為T 的指標的移動,以sizeof(T) 為移動單位。
因此,對上題來說,a 是乙個一維陣列,陣列中有5 個元素; ptr 是乙個int 型的指標。
&a + 1: 取陣列a 的首位址,該位址的值加上sizeof(a) 的值,即&a + 5*sizeof(int),也就是下乙個陣列的首位址,顯然當前指標已經越過了陣列的界限。
(int *)(&a+1): 則是把上一步計算出來的位址,強制轉換為int * 型別,賦值給ptr。
*(a+1): a,&a 的值是一樣的,但意思不一樣,a 是陣列首元素的首位址,也就是a[0]的首位址,&a 是陣列的首位址,a+1 是陣列下一元素的首位址,即a[1]的首位址,&a+1 是下乙個陣列的首位址。所以輸出2*(ptr-1):
因為ptr 是指向a[5],並且ptr 是int * 型別,所以*(ptr-1) 是指向a[4] ,輸出5。
我們來看一下 VS 中 Watch 視窗中的值:
a 在這裡代表的是陣列首元素的位址即a[0]的首位址,其值為0x0082fb6c
&a 代表的是陣列的首位址,其值為0x0082fb6c
a+1 的值是0x0082fb6c + 1*sizeof(int),等於0x0082fb70
但是 &a+1 的結果卻是 0x0082fb80
a+1 我們很容易理解,是陣列第二個元素的首位址,但 &a+1 呢?
其實,我們從一開始就沒有把概念理清,a 代表的是陣列首元素的位址 ,即等同於 &( a[0] ) ,
而,&a 代表的是陣列的首位址,注意,是陣列,不妨我們用 &a+1 的值減去 a 的值,0x0082fb80 - 0x0082fb6c = 20 = 5 * sizeof(int)
是不是發現了? 原來 &a+1 中的加1 ,相當於加的是 a 這個陣列的長度,這個要區別於 a+1 。
現在我們知道:
a+1 的值為 0x0082fb6c + 1*sizeof(int),等於0x0082fb70
&a+1 的值為 0x0082fb6c + sizeof(a)* sizeof(int),等於0x0082fb80 (這裡有一點需要注意,當 a 作為實參傳遞進函式時,32位機子下 sizeof ( a) 不是陣列元素個數,而是 4 )
關於陣列名和指標的乙個詭異問題?
邱昊宇 一般的誤解是,下標運算子 是屬於陣列的,然而事實上它是定義在指標上的 x y 的定義是指標算術 x y 陣列 int arr 42 之所以可以做 arr 2 是因為表示式 arr 被從 int 42 型別隱式轉換成了指向陣列首元素的 int 型別,即大家常說的 陣列名的退化 所以並不是 p1...
請教乙個C語言指標陣列問題?
郭建波 陣列指標 也稱行指標 定義 int p 10 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是10,也可以說是p的步長。也就是說執行p 1時,p要跨過10個整型資料的長度。例 int p 4 該語句是定義乙個陣列指標,指向含4個元素的一維陣列。所以陣列指標也稱指...
C 指標訪問指向陣列的乙個小問題?求大神解答?
sliter不是jpg 想要解釋清楚這個事情其實是比較困難的。首先要從陣列開始說。你應該知道,形同int a這樣的陣列被稱為c風格陣列。c風格陣列在c c 中並不能稱得上是一種資料型別。a在語義上說是一種唯讀引用,而引用這種語法在c裡是不存在的 我不確定比較新的c標準有沒有加 為什麼說a 是一種語義...