2014-02-11 38 views
-1

我很困惑這個代碼是如何打印它做什麼用C這是什麼在C打印,以及如何?

#include <stdio.h> 

void print_elements(int i) { 

    int j; 
    short arr[3] = {0x01,0x02,0x03}; 
    char * ptr = (char *)arr; 
    for(j=0;j<=i;j++){ 
     printf("\n %x,", *(ptr+j)); 
    } 
} 

main() { 
    print_elements(4); 
} 

它打印出:

1, 
0, 
2, 
0, 
3, 

爲什麼輸出這樣看?

某些信息,這可能是有用的:

  1. 字節排序是小端
  2. 陣列ARR的第一個元素的地址爲0x00
  3. 短爲2字節

回答

0

它逐字節地打印數組元素。每個短片在您的機器上有2個字節,並以「小端」順序存儲(即最低有效字節在前)。由於您已經使用值1,2,3對元素進行了初始化,因此它會按預期打印1,0,2,0,3,0(實際上,在您的示例中,您已經要求它僅打印第一個5個字節,所以最後的0不會被打印。)

+0

所以澄清..它是按字節打印字節,但爲什麼它分開處理在0×01的0和1?他們不是3入門數組中的一個入口嗎? –

+0

它不「分開處理」。 '0x01'只是'1'。但它存儲在2個字節(在你的機器上的「短」的大小)。其中一個字節的值爲0,另一個的值爲1. – ooga

+0

謝謝! :D欣賞它 –

1

短佔用兩個字節的內存。這爲0x01存儲爲

01 02 03

您的系統中留下的是1 0 2 0 3 0

當您使用字符指針和強制轉換陣列

被視爲焦小尾數權它在一個時間穿越的1個字節

您的數組指針看起來像這樣1 0 2 0 3 0

所以在印刷的順序,直到3當你請求的第一循環的陣列得到它的四個要打印的元素。

+0

因此,因爲它被存儲爲01,02和03並且按小端排序,並且由於01,02和03中的1和2是最不重要的位,所以它在技術上爲每個數組元素向後排序?因此打印1,0,2,0,3。 –

+0

知道了,沒關係,謝謝! –

+0

是的。每個元素依次存儲在各自的位置arr [0] = 01(MSB首先存儲爲0,然後是LSByte,即1),因此該系列10 20 30. – const

-1

不是編寫代碼的最清晰的方式,但我相信作者有一個很好的理由。從看arr開始。假設短褲是16位在這裏簽署的整數,你ARR數組元素是這樣的:

  • 0:00 | 01
  • 1:00 | 02
  • 2:00 | 03

在內存中,以字節爲單位的整個區域如下所示:00 | 01 | 00 | 02 | 00 | 03

ptr指針設置爲指向此內存區域的開始位置。

接下來,您的for循環會經歷五次循環(0..1..2..3..4)。對於每次迭代,你想從記憶的區域打印每個字節,跳過第一區域:

  • (跳過):00
  • 0:01
  • 1:00
  • 2 :02
  • 3:00
  • 4:03
+0

不存在。看起來「小端」。 – ooga

相關問題