2014-02-11 40 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

相关问题