Доступ к значению атрибута структуры с использованием адреса памяти - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь улучшить свои знания, используя указатели в C ++, и я хочу получить доступ к значению атрибута структуры по адресу памяти.У меня определена эта структура:

#pragma once
typedef struct EXAMPLE_STRUCT{
    uint8_t a;
    uint16_t b;
    float c;
} Example_Struct;

Я хочу получить значение a присвоить адрес памяти (не имя атрибута):

Example_Struct* ptr;
ptr = &(wheather_struct[0]);

В этот момент у меня есть ptr значение адреса памяти первого элемента в структуре.Итак, я думаю, что это адрес памяти переменной a .Затем я попытался получить значение этого адреса памяти, как:

uint8_t value;
value = *ptr;

Но у меня есть ошибка при компиляции:

Ошибка C2440: '=' преобразование не можетсделать из 'Example_Struct' в 'uint8_t'

Не могли бы вы помочь мне получить доступ к a значению, используя только указатели?(без указания имени example_struct-> a)

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Простой пример доступа к первому члену структуры.

// Example program
#include <iostream>
#include <string>
#include <cstddef>

struct example_struct{
    uint8_t a;
    uint16_t b;
    float c;
};

int main()
{
    example_struct a;
    a.a =42;
    uint8_t *ptr = (uint8_t*)&a;
    float *fptr = (float *)(((uint8_t *)&a) + offsetof(EXAMPLE_STRUCT, c));

    std::cout << "Hello, " << +(*ptr) << "!\n";
    std::cout << "Hello, " << +(*fptr ) << "!\n";
}
0 голосов
/ 22 октября 2018

Вы не можете получить доступ к первому элементу структуры, как если бы вы обращались к первому элементу массива (с [0]).Элементы структуры доступны только по имени.

Если вы хотите получить адрес структуры, вы можете сделать это следующим образом.

typedef struct example
{
    int a;
} Example_Struct;

Доступ к элементам.

Example_Struct exampleStruct;
exampleStruct.a = 5; // accessing the first element

Example_Struct* structPtr = &exampleStruct; // pointer to the structure
structPtr->a = 10; // accessing the first element

int* intPtr = &(exampleStruct.a); // pointer to the first element of the struct
int* intPtr2 = &(structPtr->a) // also pointer to the first element

Существует способ получить доступ к первому элементу без использования его имени, но это не очень хорошая практика.

Структура - это только место в памяти, где вы храните свои данные.Таким образом, приведение указателя на структуру к другому типу даст вам память, представленную как этот тип.

Example_Struct exampleStruct;
int* firstElPtr = (int*)&exampleStruct; //representing the memmory as an int
int firstEl = *((int*)&exampleStruct); //representing and dereferencing the memmory as an int

Обратите внимание, что смысл создания структуры заключается в том, что элементы могут быть доступны по их именам, и этобезопасный и самый производительный.Если вы хотите делать такие вещи, лучше используйте массив uint8, или у вас могут возникнуть проблемы с выравниванием памяти.

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