1.
[cpp]view plain
copy
#include
#include
intmain()
ptr++;
printf("%d "
,*ptr);
return
0;
}
剛剛看這樣的題目,感覺蠻簡單的。
ptr定義指向了 m_array的首位址, char型別1位元組。
乙個int4個位元組 ptr++後, 指標ptr的值加上1乘sizeof(int),在32位程式中就是加上了1乘4=4個位元組。
所以現在ptr其實是指向m_array[4], 按照這樣的輔助,列印應該是4.
可是列印結果是134678021
頓時傻眼了。
不斷的思考,google,還是沒搞懂。 最後,在群裡詢問,終於,貌似弄懂了....
試著用printf("%x ",*ptr);列印,就能知道錯在哪了。
現在的列印結果是08070605
這樣的結果,讓我重新思考了。
%x是16進製制輸出。
現在陣列裡面的資料是 1 2 3 4 5 6 7 8 。。。。。。
即ptr的指標指向的區域是前面4個char。就是0x04030201
ptr++指向下乙個int區域,就是就是0x08070605
也就是,ptr這個指向int型別資料的指標,*ptr表示指標所指空間儲存資料,是int型,佔四個位元組。 而不是單純的利用m_array[4]表示。(陣列為char,m_array[4]僅佔乙個位元組)。
這樣解釋,貌似能說通了。 先留個記錄,便於以後回顧。
2.從網路上看到這樣一道有意思的題目,是關於陣列與指標的問題,描述如下:
[cpp]view plain
copy
main()
; int
*ptr=(
int*)(&a+1);
printf("%d,%d"
,*(a+1),*(ptr-1));
}
輸出為:2,5
請解釋以上**的輸出結果。
答案如下:
*(a+1)其實很簡單就是指a[1],輸出為2.
問題關鍵就在於第二個點,*(ptr-1)輸出為多少?
解釋如下,&a+1不是首位址+1,系統會認為加了乙個整個a陣列,偏移了整個陣列a的大小(也就是5個int的大小)。所以int *ptr=(int *)(&a+1);其實ptr實際是&(a[5]),也就是a+5.
原因為何呢?
&a是陣列指標,其型別為int(*)[5];
而指標加1要根據指標型別加上一定的值,不同型別的指標+1之後增加的大小不同,a是長度為5的int陣列指標,所以要加5*sizeof(int),所以ptr實際是a[5],但是ptr與(&a+1)型別是不一樣的,這點非常重要,所以ptr-1只會減去sizeof(int*),a,&a的位址是一樣的,但意思就不一樣了,a是陣列首位址,也就是a[0]的位址,&a是物件(陣列)首位址,a+1是陣列下一元素的位址,即a[1],&a+1是下乙個物件的位址,即a[5]。
c指標 2個疑惑。
先註明,寫給自己看的。1.include include int main ptr printf d ptr return 0 剛剛看這樣的題目,感覺蠻簡單的。ptr定義指向了 m array的首位址,char型別1位元組。乙個int4個位元組 ptr 後,指標ptr的值加上1乘sizeof int...
兩個指標相減
原文 如果兩個指標指向同乙個陣列,它們就可以相減,其結果為兩個指標之間的元素數目。假設我住在廣場路124號,mag住在廣場路142號,每家之間的位址間距是2 在我這一側用連續的偶數作為街道位址 那麼mag家就在我家往前 142 124 2家,也就是說可以得到我們兩家之間相隔8家。也就是說可以利用兩個...
C 指標加整數 兩個指標相減的問題
說來慚愧,寫c 有一段時間了。這個問題從來沒有認真考慮過,此次標記於此 考慮如下問題 1 char a 20 2 int ptr int a 3 ptr 第3句ptr 實際為ptr右移乙個int空間 即4個位元組 的距離,此時ptr指向a 4 若第3句改為 int p ptr 2 則p指向a 8 這...