1. 程式人生 > >c++中指標問題一個很好的例子

c++中指標問題一個很好的例子

偶爾在問題區看到這個問題,感覺有助於對指標問題理解,所以記錄一下,希望給看到的你一些幫助。程式碼如下:

#include <iostream> 
using namespace std;
int main(){
    int a[2]={261,0};
    int *pi=a;
    char *p=(char *)pi;
    cout<<*(int*)p++<<endl;
    cout<<*(int*)p<<endl;
    cout<<(int)*p<<endl;
    cout<<(int
)*(char*)pi<<endl; return 0; }

輸出為:

261
1
1
5

這個問題首先你要了解計算機的記憶體機制,計算機記憶體一般是按位元組儲存的(至少我們現在用的pc機都是這樣),我們分析的時候經常數字轉化為16進位制進行分析,因為一位16進位制正好是4bit,兩位16進位制就是一位元組,261轉化為16進位制之後是105,如下:
這裡寫圖片描述
然後它在記憶體中的儲存如果按照大端儲存,就是下圖這樣的,我們用的pc機大多是按照大端儲存的,就是低位元組存在記憶體的低地址,小端儲存相反,不清楚的話自己百度一下:
這裡寫圖片描述

cout<<*(int
*)p++<<endl;

解釋:p指標轉化為int型指標,並取內容,也就是說,從p指標指向的地方開始,取int長度個位元組,也就是4位元組,所以取出來的是00,00,01,05,也就是261的16進位制,輸出時按照10進位制輸出的,所以是261

cout<<*(int*)p<<endl;

和上一步一樣,只是上一步p已經後置自增,所以現在p指向01,所以取出來是00,00,00,01,也就是1的16進製表示(與其十進位制表示一樣),所以輸出1。

cout<<(int)*p<<endl;

這一步是將p指向的內容取出來,記住p是一個char型指標,一直都沒有改變,所以只取一個位元組,也就是01,(int)部分是將它擴充套件為4位元組,這採用的應該是符號擴充套件(這是數字邏輯或計算機組成原理的知識,不清楚請自行百度),因為是正數,所以前面添0就行,擴充套件之後是00,00,00,01,和上一步一樣,輸出1。

cout<<(int)*(char*)pi<<endl;

這一步看著很繞,其實都是紙老虎,首先pi是一個int型指標,指向的是05,先將它轉外為char型指標並取其內容,也就是隻取一個位元組內容,就是05,然後將其轉化為int型的值,也是符號擴充套件,前面加0,擴充套件之後是00,00,00,05,再將這16進位制轉化為十進位制,就是5。

需要注意的是,指標操作,型別轉換操作,應該考慮操作的優先順序,這四個轉化中,都是自後向前的。