Получение 8-битных индивидуальных адресов uint16_t с помощью указателей - PullRequest
2 голосов
/ 24 сентября 2019

Адресное пространство на моем устройстве составляет 8 бит.У меня есть 16-битное целое число без знака.Я хотел бы иметь возможность использовать указатели для индивидуального извлечения данных из двух регистров, составляющих 16-битное целое число.

uint16_t num = 12345;
uint8_t *ptr1;
uint8_t *ptr2;

Спасибо за помощь, указатели сбивают меня с толку.

Ответы [ 2 ]

2 голосов
/ 24 сентября 2019

Вы можете взять адрес 16-битной переменной и привести его к указателю в uint8_t, затем добавить необходимое смещение.

uint16_t num = 12345;
uint8_t *ptr1 = ((uint8_t *)&num);
uint8_t *ptr2 = ((uint8_t *)&num) + 1;
1 голос
/ 24 сентября 2019

если бы был способ сделать это без приведения типов?

Решение без приведения: используйте union.

#include<stdio.h>
#include<stdint.h>

typedef struct my_struct {
  uint8_t var1;
  uint8_t var2;
} my_struct;

int main(void) {
  uint16_t num = 12345;

  union {
    uint16_t u16;
    uint8_t u8[2];
  } x = {.u16 = num};

  uint8_t *ptr1 = &x.u8[0];
  uint8_t *ptr2 = &x.u8[1];

  printf("num x%04X\n", num);
  printf("*ptr1 x%02X\n", *ptr1);
  printf("*ptr2 x%02X\n", *ptr2);
  return 0;
}

Выход

num x3039
*ptr1 x39
*ptr2 x30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...