2011-03-14 79 views
3

我知道,你可以採取一個指針,如:返回一個指針的開始?

someFunction(const char* &txt) 
{ 
    txt++; //Increment the pointer 
    txt--; //Decrement the pointer 
} 

我怎麼回指針的開始? (不計我的增量數和遞減的量),我在想是這樣的:

txt = &(*txt[0]); 

但是,這並不似乎工作(分配指向其起始位置)。

任何幫助,將不勝感激

佈雷特

回答

9

你不能。你必須要麼保存它的原始位置:

const char *o = txt; 
// do work 
txt = o; 

或者使用索引:

size_t i = 0; 
// instead of txt++ it's i++ 
// and instead of *txt it's txt[i] 
i = 0; 

你嘗試:

txt = &(*txt[0]); 

是不正確,如果你看它。首先,它需要txt[0](其類型爲char),然後試圖用*對其進行解引用,然後將該地址與&運算符(理論上產生原始結果,儘管我不想仔細考慮是否這樣適用於取消引用算術類型,如char),然後將該(算術)結果分配給指針。這就像你說的:

const char *txt = 'a'; 

它沒有任何意義。你可能正在尋找只是

txt = &txt[0]; 

其中,乍看之下,看起來像它的設置txt指向的txt的第一要素,但請記住,txt[0]只是*(txt + 0),或*txt。而&*txt簡化爲txt,所以你切實做好:

txt = txt; 

還是一無所獲。你得到相同的指針。使用我描述的兩種方法之一。

+0

Hrm,好吧,這很有道理,爲什麼我沒有找到它的運氣! – Brett 2011-03-14 04:51:21

+0

@佈雷特 - 我在你的「方法」上詳細闡述了一點,我希望這不是太混亂。當你第一次遇到指針時,指針會非常困難,所以如果有什麼不清楚的地方,請告訴我,我會再試一次。 – 2011-03-14 04:55:10

+0

+1。很好,完整的答案。 – 2011-03-14 05:11:56

0

你不能不計算,因爲它是一個指針,所以當你增加指針時,你實際上離開了它指向失去該信息的地方。

比較與

int a[10] = {0}; 
int *p = NULL; 

p = a; // start of array 
++p; // p points to a + 1 
++p; // p points to a + 2, 
     // .. but there is no intrinsic information in 'p' where start of 'a' is. 
0

的最簡單的方法是使用另一個值保存原始0索引。我不認爲你實際上可以解決「第一」,除非它像一個有序的數據結構。

3

指針沒有「開始」。每當你增加一個指針(或減少或以其他方式改變)時,你會得到一個新的,完全獨立的指針值,它沒有舊指針值的「記憶」,也沒有與舊指針值的關係。

如果您需要恢復舊的指針值,您必須記住該值或記住更改(以便您可以稍後再回滾)。沒有其他方法可以恢復舊價值。