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类型等其他类型的数组都是可以的