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
誰でもそれを行う方法を手伝ってもらえますか?
1 つの方法はarray
、配列に変換することです。
union {
uint64_t intval;
uintptr_t ptrval;
};
そしてそれで作業します。
もちろん、特定の要素が整数またはポインターを格納しているかどうかを知る何らかの方法が必要になります。
使用できますreinterpret_cast
:
array[3] = reinterpret_cast<std::uintptr_t>(pointer);
(uintptr_t
からです<cstdint>
)
ただし、可能であればこれを避けるようにしてください。デザインを再考できますか?
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::vector
C++11 ではs を共用体に入れることができますが、これはすべてのコンパイラでサポートされているわけではありません。
推測させてください:配列が必要で、その各要素は数値または数値の別の配列のいずれかになりますか?その場合は、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.
はい、できます。
a [3] =(unsigned long long)&a; (ウィンドウ内)
ポインタ値を取得するには、(unsigned long long *)a [3]