Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > указатели на первый элемент массива


Автор: En_t_end 17.5.2006, 15:05
Как можно без ввода нового указателя на первый элемент массива вернуть(что-то типа дефолтной позиции) исходному указателю значение адреса первого элемента ?
Приведу пример:
Код

char test_m[X_DEFINED];
char *ptest = test_m;
char *ptmp = ptest; //очень неудобно... лишняя переменная
*ptest++ = 'T';
*ptest++ = 'E';
*ptest = '\0';
ptest = ptmp; // не спрашивайте зачем :-)
 

Автор: Mayk 17.5.2006, 15:08
Мм. 
Код

ptest = test_m;


Ну или более подробно:
Код

ptest = &test_m[0];

 

Автор: En_t_end 17.5.2006, 15:12
Mayk
А если я заюзываю указатель ptest в функции, а адресс массива передается как раз через ptest ? Как тогда ? не имея доступа к реальному массиву я ничего похоже сделать не могу.

Добавлено @ 15:17 
char *test_ret(char *result)
{//do smt...
*result++ = 's';
*result++ = 'e';
//....
*result = '\0';
return result; // и тут наблюдаем funny-тупость, если в cout << передается указатель, возвращаемый функцией :-)
}
Ессно можно выйти из ситуации, если ввести новый указатель, но ведь это дополнительная память и несколько тактов процессора - жалко smile 

Автор: Mayk 17.5.2006, 15:20
Если у тебя есть адрес массива то конечно только через новую переменную. А собственно как ещё ptest может узнать что массив начался/кончался?

Ну или сделай в конце ptest -= (кол-во увеличений); . хотя в таком случае будет Большой Ой, если это кол-во забудешь изменить.

Добавлено @ 15:23 
Цитата(En_t_end @  17.5.2006,  19:12 Найти цитируемый пост)
Ессно можно выйти из ситуации, если ввести новый указатель, но ведь это дополнительная память и несколько тактов процессора - жалко 

Ну ты блин нашёл о чем жалеть smile сделай тогда ф-цию void'ной и делай test_ret(arg); cout << arg вместо cout << test_ret(arg);

Добавлено @ 15:24 
Преждевременная оптимизация - корень всех зол 

Автор: Earnest 17.5.2006, 18:31
Ну если совсем жаба душит, тогда делай так:
Код

char *test_ret(char *result)
{
   // do smt...
   result[0] = 's';
   result[1] = 'e';
   // ...
    return result;
}

Эта, канешна, значительно медленнее, чем твой код  smile  smile

Добавлено @ 18:32 
И еще одна гениальная мысль: если ты в result символы последовательно записываешь, можешь strcpy использовать... smile   

Автор: SergeCpp 17.5.2006, 18:59
Я в таких случаях использую конструкцию вида

array[ index++ ] = value; 

Автор: En_t_end 17.5.2006, 19:44
Earnest
"И еще одна гениальная мысль: если ты в result символы последовательно записываешь, можешь strcpy использовать..."
Неа... это я просто пример такой привел.
SergeCpp, "array[ index++ ] = value;"
:-).... ЗЫ это слиииишком жирно...

Добавлено @ 19:45 
Earnest
че-то меня в твоем коде операторы разыменования напрягают. 

Автор: Mayk 17.5.2006, 19:57
En_t_end,  если тебе ну уж так важно быстродействие, то тебе надо идти к ассемблерщикам. 
Правда современные компиляторы хорошо оптимизируют. Поэтому не удивляйся, если твой АСМовский код будет работать медленнее твоего же с++ ного .  

Автор: Earnest 18.5.2006, 08:16
Цитата(En_t_end @  17.5.2006,  20:44 Найти цитируемый пост)
че-то меня в твоем коде операторы разыменования напрягают.  

А это я из твоего кода скопировала, а убрать забыла...  smile  Поправила... 

Автор: En_t_end 18.5.2006, 15:43
Mayk, 
Цитата(Mayk @  17.5.2006,  23:57 Найти цитируемый пост)
если тебе ну уж так важно быстродействие, то тебе надо идти к ассемблерщикам. 

Мне и тут хорошо... smile
Цитата(Mayk @  17.5.2006,  23:57 Найти цитируемый пост)
Правда современные компиляторы хорошо оптимизируют.

Тут как раз проблема. Я постепенно иду к кроссплатформенности и соответственно приходиться юзать разные компиляторы. Если бы я юзал только Visual Studio, думаю, не стал бы даже и думать о такой примитивной(но хочу заметить от этого её эфективность не падает) оптимизации. Но приходиться заюзывать и старые борландовские компиляторы,g++, иногда просто g. А код, ведь, везде должен быть боеспособен.
 

Автор: Mayk 18.5.2006, 16:13
Цитата(En_t_end @  18.5.2006,  19:43 Найти цитируемый пост)
 Если бы я юзал только Visual Studio, думаю, не стал бы даже и думать о такой примитивной(но хочу заметить от этого её эфективность не падает) оптимизации. 

Кстати. А чем тебя не устривает новая переменная? Запись в неё и чтение из неё выполняются не медленнее, чем
*ptest++ = 'T';.
А выделятся и освобождаться она вообще может за нулевое время (какая разница как сдвинуть стек - на 4 байта, или на 8?).  

Автор: En_t_end 18.5.2006, 19:24
Mayk, 
Цитата(Mayk @  18.5.2006,  20:13 Найти цитируемый пост)
А выделятся и освобождаться она вообще может за нулевое время (какая разница как сдвинуть стек - на 4 байта, или на 8?).  

 smile 
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)