繁体   English   中英

具有值和指针的数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM