我有一个 64 位无符号整数数组。是否可以在数组的某些位置分配数组的某些指针。我是说:
array [0] = Integer
array [1] = Integer
array [2] = Pointer to array
array [3] = Pointer to array
array [4] = Integer
有人可以帮我怎么做吗?
我有一个 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>
)
如果可能的话,尽量避免这样做。你能重新考虑你的设计吗?
让我猜猜:你想要一个数组,其中的每个元素可以是一个数字或另一个数字数组?如果是这样,请创建一个 s 数组,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
s 放入联合中,但并非所有编译器都支持。
是的,我们可以做到,
a[3] = (unsigned long long)&a; (在窗口中)
并取回指针值, (unsigned long long *)a[3]