看下面的程式,輸入什麼?
#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 ...