вернуться к началу указателя? - PullRequest
3 голосов
/ 14 марта 2011

Я знаю, что вы можете взять указатель, такой как:

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

как мне вернуться к началу указателя? (не считая моего количества приращений и уменьшая эту сумму) я думал о чем-то вроде:

txt = &(*txt[0]);

Но это не похоже на работу (назначение указателя на его начальное местоположение).

Любая помощь будет принята с благодарностью

Brett

Ответы [ 4 ]

9 голосов
/ 14 марта 2011

Вы не можете.Вы должны сохранить исходную позицию:

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;

Или ничего.Вы получаете тот же указатель.Используйте один из двух методов, которые я описал.

3 голосов
/ 14 марта 2011

Указатель не имеет «начала». Каждый раз, когда вы увеличиваете указатель (или уменьшаете, или изменяете любым другим способом), вы получаете новое, полностью независимое значение указателя, которое не имеет «памяти» старого значения указателя и не имеет отношения к старому значению указателя.

Если вам нужно восстановить старое значение указателя, вы должны либо запомнить значение, либо запомнить изменения (чтобы вы могли откатить их позже). Другого способа восстановить старое значение нет.

0 голосов
/ 14 марта 2011

Самый простой способ - использовать другое значение для сохранения исходного индекса 0. Я не думаю, что вы на самом деле можете обратиться к «первому», если это не похоже на сортированную структуру данных.

0 голосов
/ 14 марта 2011

Вы не можете, не считая, потому что это указатель, поэтому, когда вы увеличиваете указатель, вы фактически покидаете место, на которое он указывал, теряя эту информацию.

Сравнить с

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...