陣列和指標的乙個問題?

時間 2021-05-06 08:48:03

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 是一種語義...