一、舉例說明
上圖對應函數調用為int printf(const char *fmt, ...),fmt為char *指針類型,所以共占了32位字節,但是*fmt執行的是一個字節,*fmt++執行的是下一個字節,&fmt得到一個32位地址,(char *)&fmt得到是一個執行字節的指針,(char *)&fmt+4後正好執行了var3,因為fmt占用4個字節。(int *)((char *)&fmt+4),又將其轉換為執行4個字節的指針,此時*((int *)((char *)&fmt+4)),那麼取出來的數字變是32位的數據,也就是var3。
總結:強制轉換為char *,那麼指針++後移動一個字節,*指針得到一個字節。強制轉換為int *,那麼指針++後移動4個字節。同時*指針得到4個字節。
無論什麼類型的指針變量,相減後得到的都是相差的個數。
二、什麼時候需要強制類型轉換
[cpp]
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a =6336;
char *b = (char *)&a;
printf("%d",*b);
getchar();
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a =6336;
char *b = (char *)&a;
printf("%d",*b);
getchar();
return 0;
}
此時得到的結果為-64,因為*b只指向一個字節。