Typecasting C指针访问原始内存

时间:2014-04-28 12:03:36

标签: c pointers

我试图了解如何通过类型转换来访问更多内存。观看此视频......

https://www.youtube.com/watch?v=ldN5i6MMquM

听起来我可以使用指向uint16_t的指针来访问8位寻址存储器阵列的2个部分。我似乎无法访问超过8位,我不知道如何在c中写入它以便能够访问两个字节而不是一个字节。我从下面的内容开始

    uint8_t *memory = (uint8_t*) malloc(8);
    memory[0] = 5;
    memory[1] = 21;
    memory[2] = 4;
    memory[3] = 9;
    memory[4] = 23;
    memory[5] = 66;
    memory[6] = 211;
    memory[7] = 46;

3 个答案:

答案 0 :(得分:0)

如果您已经拥有所有uintXX_t类型的定义和一个像这样的字节数组

uint8_t bytes[8]; 
uint32_t *p3 = (uint32_t *)&bytes[4];
uint8_t *p = bytes;
uint16_t *p1 = (uint16_t *)bytes;
uint32_t *p2 = (uint32_t *)bytes;

                     | uint32_t *p3: accesses a 32bit value starting at bytes[4]
                     v
 bytes: [0][1][2][3][4][5][6][7]
         ^
         | uint8_t *p: can access bytes[0] 
         ^
         | uint16_t *p1: can access 16bits (2 bytes) [0][1]
         ^ 
         | uint32_t *p2: can access 32bits (4 bytes) [0][1][2][3]

等等。 您还可以定义这样的结构:

struct A { uint8_t x, uint16_t y; };
struct A *ps = (struct A *)bytes;

然后ps会看到'你的bytes数组作为A类结构,你可以像这样访问这些值:

 uint8_t x = ps->x; // bytes: [0]
 uint16_t y = ps->y; // bytes: [1][2]

了解了这一点后,请阅读结构成员对齐:)

答案 1 :(得分:0)

在你提到的视频中,他并没有真正分配内存。 所有这些都被解释为如果指针类型是uint8_t,则指针指向8位长的存储器位置。
如果指针现在是类型转换为指向unit16_t,它现在指向16位长的存储单元。这相当于两个8位的位置。

它不会让你记忆中的内存增多。它只是解决了比以前更大范围的地址。

答案 2 :(得分:0)

只需定义另一个16位指针,将其分配给相同的地址

  uint16_t* memory16 = (uint16_t*)memory;

现在您可以查看内存中的每两个8位元素,例如一个16位元素

  for(i = 0; i< 4; ++i)
      printf("%d  ", memory16[i]);  

并感受到差异

 for( i = 0; i< 8; ++i)
     printf("%d  ", memory[i]);