2011-03-14 77 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

指针没有“开始”。每当你增加一个指针(或减少或以其他方式改变)时,你会得到一个新的,完全独立的指针值,它没有旧指针值的“记忆”,也没有与旧指针值的关系。

如果您需要恢复旧的指针值,您必须记住该值或记住更改(以便您可以稍后再回滚)。没有其他方法可以恢复旧价值。