C++数组类型中存入结构体类型对象

最近看Binder机制的时候看到一个unsigned类型数组中不仅可以存放unsigned int类型还可以存放结构体对象,感到十分惊奇,下面我们来看一下

uintptr_t类型和指针类型的区别

uintptr_t是C/C++语言中一个无符号整数类型,它的长度和指针类型相同,在32位平台上为4字节,在64位平台上为8字节。uintptr_t通常用于不需要具体指针值但需要操作指针的场合,比如在某些底层系统编程中,需要用一个整数表示内存地址,而不是使用指针来操作内存。

指针类型则是一个用于存储变量地址的数据类型,例如int*表示指向int类型变量的指针。指针类型可以进行加减运算、解引用和等于/不等于比较等操作,因为指针类型存储了具体的内存地址。在程序中,指针类型通常用来动态分配内存,构建复杂数据结构等。

总的来说,uintptr_t类型是一个无符号整数类型,用于存储内存地址值;指针类型则是一种特殊的数据类型,用于存储变量的地址,并且支持各种针对指针的操作。在某些场景下,uintptr_t类型可以替代指针类型完成相应的操作,但是需要注意指针类型的生命周期和类型安全性问题。

示例

1、将unsigned类型数组转换为uintptr_t类型并打印出数组中的内容

#include <iostream>
#include <cstdint>

using namespace std;

int main() {
    unsigned arr[] = {1, 2, 3, 4, 5};
    int len = sizeof(arr) / sizeof(unsigned);

    uintptr_t addr = reinterpret_cast<uintptr_t>(arr);
    for (int i = 0; i < len; ++i) {
        uintptr_t ptr = addr + i * sizeof(unsigned);
        unsigned value = *reinterpret_cast<unsigned*>(ptr);
        cout << value << " ";
    }
    cout << endl;

    return 0;
}

使用了uintptr_t类型来存储数组的内存地址,并通过reinterpret_cast操作符将其转换为unsigned*类型的指针。然后,在循环中依次访问数组元素的内存地址,再通过reinterpret_cast将其转换为unsigned类型。

2、结构体类型存入unsigned类型的数组中并取出打印结构体信息

#include <iostream>

using namespace std;

struct Person {
    string name;
    int age;
    double height;
};

int main() {
    unsigned array[100];
    Person person = {"Li Ming", 25, 1.75};

    // 存储到数组中  只存储了一个对象  下面那个for循环遍历是在把结构体所有的字节都写到数组里面
    unsigned* ptr = reinterpret_cast<unsigned*>(&person);
    for (int i = 0; i < sizeof(Person) / sizeof(unsigned); ++i) {
        array[i] = *(ptr + i);
    }

    // 从数组中取出并打印结构体信息   如果还想要访问后面array数组的内容,可以array += (sizeof(*p)/sizeof(unsigned))
    Person* p = reinterpret_cast<Person*>(array);
    cout << "Name: " << p->name << endl;
    cout << "Age: " << p->age << endl;
    cout << "Height: " << p->height << endl;
  
    return 0;
}

在上面的例子中,我们定义了一个名为Person的结构体类型,包含三个成员变量:name、age和height。然后,我们创建了一个Person类型的变量person,并将其地址强制转换为unsigned类型的指针。接下来,我们使用循环把person所占用的内存块中的每个unsigned类型的数据存储到数组array中。最后,我们再次使用强制类型转换将数组中的unsigned类型数据转换为Person类型的指针,并打印出结构体信息。

 

除此之外,不仅仅可以使用unsigned类型数组、使用int类型等其他类型的数组都是可以的

 

posted @ 2023-03-22 11:13  kongbursi  阅读(467)  评论(0编辑  收藏  举报