使用内存地址访问

时间:2018-10-22 12:56:45

标签: c++ pointers struct

我正在尝试使用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 :(得分:1)

您无法访问结构的第一个元素,就像访问数组的第一个元素(使用[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数组,否则可能会导致内存对齐问题。

答案 1 :(得分:1)

访问结构的第一个成员的简单示例。

// 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";
}