2013-01-21 62 views
1

我有一個64位無符號整數的數組。是否可以在它的某些位置分配一些數組的指針。我的意思是:具有數值和指針的數組

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

任何人都可以幫助我如何做到這一點?

+0

這是非常醜陋的做法(在C + +中不是在C中)將指針解釋爲數字(反之亦然)。一般來說,但根據你的例子,這很醜陋^ 2,因爲 - 你如何將它們重新解釋爲指針?也許最好的方法是修改架構。 – borisbn

回答

4

的一種方法是把array

union { 
    uint64_t intval; 
    uintptr_t ptrval; 
}; 

的陣列,並且與該工作。

當然,您將需要某種方法來了解某個特定元素是否存儲整數或指針。

3

您可以使用reinterpret_cast

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

uintptr_t<cstdint>

儘量避免可能的話,雖然這樣做。你能重新考慮你的設計嗎?

+0

謝謝,但會「數組[3] = reinterpret_cast (指針);」它創建一個指向指定類型和長度的數組的指針,以及如何訪問?你能給出一個簡單的代碼來說明上述事實嗎? – user1838343

+2

@ user1838343當你這樣做時,你會失去所有類型的信息,所以你無法獲得它的長度。你只需將'reinterpret_cast'重新放回指針中......你想用這個做什麼? – Pubby

+0

我想把整數放入數組中。如果職位有很多值(一個值的數組),我想創建一個指針數組並存儲值。然後我必須相應地訪問這些值。 – user1838343

-1

是可以這樣做,

[3] =(無符號長長)&一個; (在Windows)

,並取回指針值, (無符號長長*)[3]

+0

你爲什麼指出「在窗戶」?此代碼在Linux或MacOS中無法使用? – borisbn

1

讓我猜:你想有一個數組,其中的每個元素可以是一個數字還是另一個數字的數組?如果是這樣,請製作一個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. 
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::vector s合併到工會中,但這並不是所有編譯器都支持的。