[英]Array with Values and Pointers
我有一个64位无符号整数数组。 是否可以在数组的某些位置分配数组的某些指针。 我的意思是:
array [0] = Integer
array [1] = Integer
array [2] = Pointer to array
array [3] = Pointer to array
array [4] = Integer
有人可以帮我怎么做吗?
一种方法是将array
转换为数组
union {
uint64_t intval;
uintptr_t ptrval;
};
并与之合作。
当然,您将需要某种方式来了解特定元素是存储整数还是指针。
您可以使用reinterpret_cast
:
array[3] = reinterpret_cast<std::uintptr_t>(pointer);
( uintptr_t
来自<cstdint>
)
尽量避免这样做。 您可以重新考虑您的设计吗?
让我猜测:您想拥有一个数组,其中的每个元素可以是一个数字或另一个数字数组? 如果是这样,请创建一个std::vector
数组,如果要存储数字,则仅保留一个值。 像这样:
typedef std::vector< long long > I64Vector;
std::vector< I64Vector > array;
array.push_back( I64Vector( { 42 } ) ); // store one integer ( 42 ) in array[ 0 ]
array.push_back( I64Vector( { 1, 2, 3, 4, 5 } ) ); // store 5 integers in array[ 1 ]
//... etc.
// accessing them
long long num = array[ 0 ][ 0 ]; // 42
const I64Vector & subarray = array[ 1 ];
long subNumber1 = subarray[ 0 ]; // 1
long subNumber2 = subarray[ 1 ]; // 2
//... etc.
您必须将array
元素的类型更改为可以存储整数和指针的类型(最好是std::vector<std::uint64_t>
)。 类型安全的方法是使用boost::variant
:
std::vector<boost::variant<std::uint64_t, std::vector<std::uint64_t>>> array;
array.push_back(1);
array.push_back(2);
array.push_back(std::vector<std::uint64_t>{4,5,6});
if (int* x = boost::get<std::uint64_t>(array[0])) { ... }
if (std::vector<std::uint64_t>* x
= boost::get<std::vector<std::uint64_t>>(array[2])) { ... }
如果要使用内置数组而不是向量,则可以使用联合而不是boost::variant
:
struct IntOrArray
{
bool isInt;
union {
std::uint64_t int_value;
std::uint64_t* array_value;
}
};
std::vector<IntOrArray> array;
IntOrArray a1;
IntOrArray a1.isInt = true;
IntOrArray a1.int_value = 1;
array.push_back(a1);
IntOrArray a2;
IntOrArray a2.isInt = false;
IntOrArray a2.array_value = arrayYouGotElsewhere;
array.push_back(a2);
if (array[0].isInt) { ... }
C ++ 11允许您将std::vector
放入联合,但这并非所有编译器都支持。
是的,我们可以做到
a [3] =(unsigned long long)&a; (在Windows中)
并获取指针值,(无符号long long *)a [3]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.