陣列和指向陣列的指標的關係

2021-09-29 20:48:26 字數 1042 閱讀 6498

看下面的程式,輸入什麼?

#include

intmain()

;int

*p =

(int*)

(&a+1)

;printf

("p = %d\n"

,*a)

;printf

("p = %d\n",*

(a+1))

;printf

("p = %d\n",*

(p-1))

;return0;

}

結果是:

p =

1p =

2p =

5

a 其實就是乙個指標 ,指向第一元素, 所以*a就是1

a+1是指標的偏移,偏移大小由指標a指向的型別來決定,上例子中,a指向int 型,所以加1就執行下乙個整型元素。

第3個怎麼解釋呢。 首先是&a, 是指標的指標, p指向 a偏移了1的位置. 這個1有多大?

那要看a是什麼型別,上面定義a的時候是等價於int a[5] = ; 所以類似於 int b

把型別和變數分開,b是int型別。 同樣,把int a [5]也分開,就是int[5] a 。所以a是 int[5]型別的。那麼&a就是指向乙個int[5]型別的指標,這個指標加1,這個1的偏移量就是int[5]的大小,也就是5個整型的大小。這樣的話p就指向這個陣列5本身所在位址的後乙個位址了。由於p是指向整型的,所以p-1的這個1是1個int的大小, 所以,p-1就回到了5所在的位址了。所以第三個就是5了

如果p的值成為這樣,那麼p指向**?

int

*p =

(int*)

&a+1

;

結果是p指向a[1]的位址

這裡涉及乙個強制轉換的概念, a原本指向的型別是int[5] , 上面的在括號i裡加1就直接跳躍5*sizeof(int)個位址。

這裡先進行了強制轉換,現在a指向的型別是int ,加1就跳躍sizeof(int)個位址,就是a[1]所在的位置

指標陣列和指向陣列的指標

分析一下三個宣告 1 cat familyone 500 familyone 是乙個500個cat物件組成的陣列 2 cat familytwo 500 familytwo是乙個500個指向的cat的指標組成的陣列 指標陣列 3 cat familythree new cat 500 familyt...

指標陣列和指向指標的指標

今天終於弄明白了,指標陣列,和指向指標的指標的區別。1 include 2 include 3 void main 4 11 for i 0 i 3 i 12 15 一 指標概念 當我們程式如下申明變數 short int i char a short int pi 程式會在記憶體某位址空間上為各變...

C指標 指向陣列的指標和指向陣列內部元素的指標

int p 5 arr 這裡的 也可以不寫,因為陣列名本身就表示陣列的首位址 int p arr int p arr int p arr 0 上面三種宣告方式都是合法且等價的 int a 5 int p a 指向陣列元素的指標,用來訪問陣列內部的元素,單位長度是sizeof int int q 5 ...