我有一個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>
)
儘量避免可能的話,雖然這樣做。你能重新考慮你的設計嗎?
謝謝,但會「數組[3] = reinterpret_cast
@ user1838343當你這樣做時,你會失去所有類型的信息,所以你無法獲得它的長度。你只需將'reinterpret_cast'重新放回指針中......你想用這個做什麼? – Pubby
我想把整數放入數組中。如果職位有很多值(一個值的數組),我想創建一個指針數組並存儲值。然後我必須相應地訪問這些值。 – user1838343
是可以這樣做,
[3] =(無符號長長)&一個; (在Windows)
,並取回指針值, (無符號長長*)[3]
你爲什麼指出「在窗戶」?此代碼在Linux或MacOS中無法使用? – borisbn
讓我猜:你想有一個數組,其中的每個元素可以是一個數字還是另一個數字的數組?如果是這樣,請製作一個std::vector
s的數組,並且如果要存儲數字,則只保留一個值。就像這樣:
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合併到工會中,但這並不是所有編譯器都支持的。
這是非常醜陋的做法(在C + +中不是在C中)將指針解釋爲數字(反之亦然)。一般來說,但根據你的例子,這很醜陋^ 2,因爲 - 你如何將它們重新解釋爲指針?也許最好的方法是修改架構。 – borisbn