我的代碼是在這裏指針輸出困惑我
int main()
{
int a=300;
char *p=(char *)&a;
printf("%d\n",*p);
printf("%d",*++p);
}
輸出
任何機構可以解釋它。
我的代碼是在這裏指針輸出困惑我
int main()
{
int a=300;
char *p=(char *)&a;
printf("%d\n",*p);
printf("%d",*++p);
}
輸出
任何機構可以解釋它。
由於我們知道int數據類型的大小取決於您的系統,因此它可以是2 bytes
或4 bytes
。同時指針指向一次一個字節。的int a = 300;
記憶表示所以,char
指針p
指向僅第一字節作爲顯示上圖中。
所以,第一次打印輸出。
然後,
printf("%d",*++p);
第一p
是增量和指針指向下一個(第二)字節。所以,下一個字節輸出是1
。
好的例證。你是如何添加它的? – CIsForCookies
最好只說至少2個字節。 「int」可以是實現者想要的任何東西。 4和8今天很常見,但誰可以說明天會帶來什麼。 – user4581301
a
太大了一個字節來表示,因爲它的二進制表示是但至少0000000100101100
(取決於int
類型多少字節得到。在這種表示它得到2個字節,它可以有4個或8個,或其他尺寸,依賴於平臺的)。
當你做char *p=(char *)&a;
你只看上a
一個字節 - 00000001---00101100
- 右邊部分,它的價值是44
當移動到下一個字節位置(++p
),字節存在左側部分(00000001
)和它的值是1
你得到這些值的原因是因爲你(如果你知道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");
}
用二進制寫'300',按字節分割字節 –
您的代碼被C和C++編譯器拒絕。發佈有效的代碼。並且不要垃圾郵件標籤。 – StoryTeller
'300' --->'0x12C' ....和little endian ... – LPs