我试图了解如何通过类型转换来访问更多内存。观看此视频......
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;
答案 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]);