指標運算四則

2021-04-20 21:02:55 字數 2586 閱讀 8209

要是看c語言的書,上面一定會說指標運算僅對陣列有意義,這話似乎也不錯,當然如果你打算對計算機系統徹底研究就不能拘泥於陣列中的指標運算了。下面我們來看看幾個例子。

定義乙個指標,然它指向記憶體中的0x10000000位置。

void * ptr = (void *)0x10000000;

然後對它賦值:

這樣嗎?

*ptr = 100;

當然不行,ptr是無型別(void)的指標,不能這樣操作,要轉化各型別才行,比如:

int * ptr_1 = (int *)ptr;

*ptr_1 = 100;

讀它的值也是一樣:

int value = 0;

value = *(int *)ptr;

ptr++;

??不對!ptr是無型別(void)的指標,不能計算!要把它轉換成乙個指向單個位元組的指標,c語言中char型別佔乙個位元組,所以要這樣:

char *ptr_1 = null;

ptr_1 = (char *)ptr;

ptr_1++;

這樣ptr_1就指向0x10000001了。

下面有一段程式碼,我們來研究一下。。。 

(環境:英特爾x86,32位處理器)

struct bbb

*p;printf("sizeof(bbb)=%d ", sizeof(bbb));//①

p = (bbb *)0x10000000;

printf("p=0x%p ", p);//②

printf("p+0x200=0x%p ", p + 0x200);//③

printf("p=0x%x ", p);//④

printf("(long *)p+0x200=0x%p ", (long *)p + 0x200);//⑤

printf("p=0x%x ", p);

printf("(char *)p+0x200=0x%p ", (char *)p + 0x200);//⑥

printf("p=0x%p ", p);

printf("(long)p+0x200=0x%p ", (long)p + 0x200);//⑦

pintf("p=0x%p ", p);

printf("(char)p+0x200=0x%p ", (char)p + 0x200);//⑧

①處會是多少?因為這裡是32位機器,按4位元組對齊,所以是24

②處:給指標p賦了值0x10000000,那麼這裡當然是

0x10000000了;

③處:指標+0x200,根據c語言的定義,這裡的乙個*p佔24個位元組(因為bbb結構佔24位元組),那麼p + 0x200 = 0x10000000 + 0x200 * 24 = 0x10000000 + 0x3000 =

0x10003000

④處:擔心什麼?p的值沒有改動啊~所以還是0x10000000

⑤處:(long *)p + 0x200?先想想符號優先順序。。。應該是先 (long *)p 了再 + 0x200。指向bbb結構的指標轉化成指向long型的指標,bbb結構佔24個位元組,long佔4個位元組,所以(long *)p + 0x200 = 0x10000000 + 0x200 * 4 = 0x10000000 + 0x800 =

0x10000800

⑥處:把p轉化成(佔乙個位元組的char型別)的指標,所以(char *)p + 0x200 = 0x10000000 + 0x200 * 1 =

0x10000200

⑦處:嗯?(long)p?什麼意思?把p轉化成long型?。。。的確如此!p以前不是指標嗎?的確,但是不管他以前是什麼,它現在都是乙個長型(long)的數了,它的值是多少?。。。看看②処,p就是0x10000000,不管他是什麼型別,它的本質就是0x10000000,所以現在p還是這個數,那麼(long)p + 0x200就等於。。。0x10000000 + 0x200,對就是這麼簡單的乙個算數,最後等於0x10000200

⑧處:⑦弄明白了,這裡就好辦了,所以它是。。。0x10000000 + 0x200 = 0x10000200。不對!這囘看清楚了,p是個char,你認為它能是0x10000000這麼大個數嗎?這時有同學說了,那⑦処怎麼就可以呢?

我們看看罪已開始給p賦值時的語句:

p = (bbb *)0x10000000;

這裡的0x10000000(化成二進位制有32位)是個long能夠表示的數,所以p就等於0x10000000了,然後把它表示成長型,長型也有32位,能夠表示這麼大的乙個數所以(long)p == 0x10000000;char佔乙個位元組,所以轉化時就會「捨去」很多東西。英特爾的x86時小端排序,比如放置0x1234這樣乙個數的時候他會在記憶體中這樣安排:34 12,那麼0x10000000會被搞成00 00 00 01,然後取char,就是頭上乙個位元組00,所以這時的p == 0。那麼0 + 0x200 =

0x200

若不信,就把上面一段程式碼編譯出來,執行驗證一把吧!

python四則運算程式 四則運算(Python)

四則運算程式 一 資訊 二.題目要求 寫乙個能自動生成小學四則運算題目的程式,然後在此基礎上擴充套件 除了整數以外,還要支援真分數的四則運算,例如 1 6 1 8 7 24 程式要求能處理使用者的輸入,判斷對錯,累積分數 程式支援可以由使用者自行選擇加 減 乘 除運算 三 import random...

四則混合運算類

using system namespace expressionoperate 對公式進行語法檢測 需要檢測的公式 public static bool isrexpression string expression case break case case case if rexpression...

java四則運算

public class arithmetic implements serializable 除法 param number1 除數 param number2 被除數 param decimal 保留幾位小數點 return public static double divide string ...