C指標兩個疑惑

2021-06-29 04:46:06 字數 1592 閱讀 4725

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 這...