2017-06-20 96 views
-6

我的代碼是在這裏指針輸出困惑我

int main()  
{  
    int a=300;  
    char *p=(char *)&a;   
    printf("%d\n",*p);  
    printf("%d",*++p);  
} 

輸出

任何機構可以解釋它。

+0

用二進制寫'300',按字節分割字節 –

+1

您的代碼被C和C++編譯器拒絕。發佈有效的代碼。並且不要垃圾郵件標籤。 – StoryTeller

+5

'300' --->'0x12C' ....和little endian ... – LPs

回答

1

由於我們知道int數據類型的大小取決於您的系統,因此它可以是2 bytes4 bytes。同時指針指向一次一個字節。的int a = 300;

ptr

記憶表示所以,char指針p指向僅第一字節作爲顯示上圖中。

所以,第一次打印輸出。

然後,

printf("%d",*++p); 

第一p是增量和指針指向下一個(第二)字節。所以,下一個字節輸出是1

+2

好的例證。你是如何添加它的? – CIsForCookies

+2

最好只說至少2個字節。 「int」可以是實現者想要的任何東西。 4和8今天很常見,但誰可以說明天會帶來什麼。 – user4581301

0

a太大了一個字節來表示,因爲它的二進制表示是但至少0000000100101100取決於int類型多少字節得到。在這種表示它得到2個字節,它可以有4個或8個,或其他尺寸,依賴於平臺的)。

當你做char *p=(char *)&a;你只看上a一個字節 - 00000001---00101100 - 右邊部分,它的價值是44

當移動到下一個字節位置(++p),字節存在左側部分(00000001)和它的值是1

0

你得到這些值的原因是因爲你(如果你知道your're做什麼,這當然是好)治療的int內存位置的兩個char存儲位置。您的原始int a在內存(字節視圖)表示,像這樣:

[0x2c=44] [0x01=1]這使得0x12c結合時是300

以下修改您的密碼有助於更好地理解這個

#include <stdio.h> 

int main(int argc, char** argv) 
{ 
    int i; 
    int a=300; 
    char *p=(char*)&a; 
    for (i=0;i<sizeof(a);i++) 
    { 
     printf("[0x%02x] ", p[i]); 
    } 
    printf("\n"); 
}