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

1 つの方法は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

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) { ... }

std::vectorC++11 ではs を共用体に入れることができますが、これはすべてのコンパイラでサポートされているわけではありません。

于 2013-01-21T08:53:10.073 に答える
1

推測させてください:配列が必要で、その各要素は数値または数値の別の配列のいずれかになりますか?その場合は、s の配列を作成し、std::vector数値を格納する場合は値を 1 つだけ保持します。このような:

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

はい、できます。

a [3] =(unsigned long long)&a; (ウィンドウ内)

ポインタ値を取得するには、(unsigned long long *)a [3]

于 2013-01-21T08:39:33.170 に答える