1

我有一个 64 位无符号整数数组。是否可以在数组的某些位置分配数组的某些指针。我是说:

array [0] = Integer
array [1] = Integer
array [2] = Pointer to array
array [3] = Pointer to array
array [4] = Integer

有人可以帮我怎么做吗?

4

5 回答 5

4

一种方法是array变成一个数组

union {
  uint64_t   intval;
  uintptr_t  ptrval;
};

并与之合作。

当然,您将需要某种方法来了解特定元素是存储整数还是指针。

于 2013-01-21T08:23:29.750 回答
3

您可以使用reinterpret_cast

array[3] = reinterpret_cast<std::uintptr_t>(pointer);

uintptr_t来自<cstdint>

如果可能的话,尽量避免这样做。你能重新考虑你的设计吗?

于 2013-01-21T08:20:17.707 回答
1

让我猜猜:你想要一个数组,其中的每个元素可以是一个数字或另一个数字数组?如果是这样,请创建一个 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.
于 2013-01-21T08:44:28.157 回答
1

您必须将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::vectors 放入联合中,但并非所有编译器都支持。

于 2013-01-21T08:53:10.073 回答
-1

是的,我们可以做到,

a[3] = (unsigned long long)&a; (在窗口中)

并取回指针值, (unsigned long long *)a[3]

于 2013-01-21T08:39:33.170 回答