2012-02-11 124 views
4

我一直在努力,我似乎​​無法得到這個正常工作。我返回一個指針列表的最後一個值,我想打印它,但它打印的是非常隨機的數字。我假設這是指針的內存地址,但是當我解引用它時,我的輸出仍然執行相同的操作。打印一個int指針的值

我Pointerlist是指針的列表,如:list<int*> pointerList

例如,這是我的方法返回:

int* end() { return (pointerList.back()); } 

的,這是我怎麼叫它。

int* totry = ca.end(); 
cout << *totry; 

這是打印存儲器地址而不是值。有沒有人有任何想法如何解決這個問題?

在此先感謝!

編輯: 這裏是INT指針指向的內容: 我爲[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] 值這樣的列表,我有一個指向該列表類似下面的不同部分的指針列表:

[0,4,8,12] 

我的代碼:int* end() { return (pointerList.back()); }在我的頭文件,並在我的.cpp文件中調用:

INT * totry = ca.end(); cout < < * totry;


這是我聲明我pointerlist

class ptrList 
    { 
    public: 
     std::list<value_type> listOfValues; 
     std::list<*int> pointerlist; 

我填我的表指針的「添加」功能裏面,我不喜歡這樣寫道:

int lstsqrt = 4; 
for (int a = 1; a < lstsqrt; a++) 
{ 
    int endptr = a + (int)lstsqrt; 
    pointerlist.push_back((&*listOfValues.begin() + endptr)); //((lstsqrt - 1) + a) ); 

} 

這是我的end()方法

int* end() {return (pointerlist.back());} 

的d然後傳遞給我的toTry變量。

+0

列表中的int *指向什麼?請給我們更多的代碼。 – 2012-02-11 03:15:08

+0

我們如何可以知道這個問題的答案? – 2012-02-11 03:17:04

+0

@Greg Hewgill對不起,我添加了一些代碼來顯示int指針指向什麼 – SSS 2012-02-11 03:19:38

回答

6

的一個問題是可能是此行:

pointerlist.push_back((&*listOfValues.begin() + endptr)); 

listOfValuesstd::list,因此,其值不存儲在存儲器的連續塊中。所以,你得到一個迭代器的第一個元素與listOfValues.begin(),與*提領該迭代,取與&地址得到一個int*,再加入一定的價值指向的地方關進內存,你不知道那是什麼是。

嘗試這樣做,而不是:

pointerlist.push_back((&*(listOfValues.begin() + endptr))); 

在其中添加endptr迭代(推進它沿着列表),然後解引用,並採取了地址。其實你可能需要使用advance而不是+

+0

std :: list迭代器不是隨機訪問,是嗎?所以它不會支持'operator +(迭代器,偏移量)' – 2012-02-11 04:03:36

+0

@BenVoigt:我永遠不會記住(我的編譯器告訴我什麼時候需要知道!),所以我添加了一個關於'advance'的註釋,這需要線性時間,但做相應的操作。 – 2012-02-11 04:04:15

+0

@GregHewgill我剛試過這個,但我不能正確實施它。我收到錯誤「Illegal Indirection」和「&」require I-Value「 這是我如何實現它: 'listOfPointers.push_back(&*(advance(listOfValues.begin(),endptr)))'' – SSS 2012-02-11 04:19:07