Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странный вид указателя 
:(
    Опции темы
and277
Дата 9.4.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



    Изучаю С++. Пока на начальном этапе. В одной из книжек попалось упражнение с станд. функцией  long strtol(const char *start, const **end, int base);
Не понятен 2-ой параметр у функции end... Это указатель - но зачем две звездочки у него. Каков смысл? Может кто нибудь объяснить?
PM MAIL   Вверх
mes
Дата 9.4.2009, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



две звездочки это указатель на указатель.
В вашем случае это необходимо, чтоб вернуть указатель из функции.

P.S. у Вас  имхо опечатка :  вместо const ** end должно быть char ** end.

Это сообщение отредактировал(а) mes - 9.4.2009, 16:40


--------------------
PM MAIL WWW   Вверх
and277
Дата 9.4.2009, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



Неа... не опечатка. Прототип такой у неё. И все же - а зачем в данном случае требуется использовать указатель на указатель. Какая в этом необходимость?
PM MAIL   Вверх
azesmcar
Дата 9.4.2009, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



and277

Как уже сказал mes это указатель на указатель..раскрою немного подробнее.
Указатель это тоже переменная, и она тоже занимает место в памяти (и там записан указатель). И у этой переменной тоже есть адрес.
Есть указатели, есть указатели на указатели, есть указатели на указатели на указатели (так можно продолжать бесконечно)
Код

char *************b = 0;

даже вот это вполне нормально (в каком то смысле smile )
smile надеюсь я вас не сильно пугаю.
PM   Вверх
mes
Дата 9.4.2009, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Зачем обычную переменную передают по указателю/ссылке знаете ?
чтоб можно было работать с самой переменной (а не с копией) и в  ней вернуть результат работы функции.
то же самое и с указателем.
Если передать просто, то функция получит копию указателя, и не сможет изменить сам указатель
и если изменение необходимо то нужно передать указатель по указателю/ссылке.

Вот пример :

Код

void f1 (char * s)
{
   ++s;
}
void f2 (char ** s)
{
   ++(*s);
}

int main ()
{
   char str []="my string";
   f1 (str);
  std::cout<<str<<std::endl;
   f2 (&str);
  std::cout<<str<<std::endl;
}



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

Добавлено @ 16:52
Цитата(and277 @  9.4.2009,  15:41 Найти цитируемый пост)
Неа... не опечатка. Прототип такой у не

Код

long int strtol ( const char * str, char** endptr, int base );

http://www.cplusplus.com/reference/clibrary/cstdlib/strtol/
там по ссылке описание, а также неплохой пример - не мешало бы разобрать smile



Это сообщение отредактировал(а) mes - 9.4.2009, 17:00


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 9.4.2009, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата

Неа... не опечатка. Прототип такой у неё. 


ясно что прототип, но ошибочный, такой код не скомпилируется, попробуйте

Цитата

И все же - а зачем в данном случае требуется использовать указатель на указатель. Какая в этом необходимость?


покажу на примере
Код

void foo(char* buf)
{
   buf = new char[10];
}

int main()
{
   char *c = 0;
   foo( c );
   //чему равен с???
}


так вот, с равен 0, так как ты хоть и присвоил указателю new char[10], на самом деле ты присвоил это копии указателя а не самому указателю..
это тоже самое что написать
Код

void foo(int v)
{
   v = 2;
}

int main()
{
   int c = 0;
   foo( c );
}


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

Надеюсь доступно рассказал?

Это сообщение отредактировал(а) azesmcar - 9.4.2009, 16:53
PM   Вверх
zim22
Дата 9.4.2009, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(mes @  9.4.2009,  16:48 Найти цитируемый пост)
Вот пример :

не компилится:  error C2664: 'f2' : cannot convert parameter 1 from 'char [10]' to 'char **'
я исправил:
Код
char *str="my string";
   f1 (str);
  std::cout<<str<<std::endl;
   f2 (&str);
  std::cout<<str<<std::endl;




--------------------
PM MAIL   Вверх
azesmcar
Дата 9.4.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



опередели меня smile 
PM   Вверх
zim22
Дата 9.4.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(azesmcar @  9.4.2009,  16:52 Найти цитируемый пост)
ясно что прототип, но ошибочный, такой код не скомпилируется, попробуйте

прототип верный. скомпилится.


--------------------
PM MAIL   Вверх
azesmcar
Дата 9.4.2009, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



zim22

Код

long strtol(const char *start, const **end, int base);

этот??? низачто не поверю, выдаст что-то вроде missing type specifier

Это сообщение отредактировал(а) azesmcar - 9.4.2009, 16:58
PM   Вверх
Anikmar
Дата 9.4.2009, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(zim22 @  9.4.2009,  16:55 Найти цитируемый пост)
прототип верный. скомпилится. 


Вы уверены, что это:
Цитата(and277 @  9.4.2009,  16:27 Найти цитируемый пост)
long strtol(const char *start, const **end, int base);

скомпилится?


PM MAIL ICQ   Вверх
azesmcar
Дата 9.4.2009, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



UnrealMan к словам придираешся.
char *b = 0;
кто скажет что b не переменная пусть первый кинет в меня камень..реч была об этом если ты не понял.
PM   Вверх
zim22
Дата 9.4.2009, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Код

long strtol(
   const char *nptr,
   char **endptr,
   int base 
);


это из MSDN

Добавлено @ 17:05
azesmcar, это уже смешно. UnrealMan и вам поставил минус. добро пожаловать в клуб smile

Добавлено @ 17:06
Цитата(Anikmar @  9.4.2009,  17:01 Найти цитируемый пост)
Вы уверены, что это:Цитата(and277 @  9.4.2009,  16:27 )long strtol(const char *start, const **end, int base);скомпилится?

функция почти аналогичная. 
Код

double strtod(
   const char *nptr,
   char **endptr 
);


для неё есть пример из МСДН
Код

char   *string, *stopstring;
   double x;
   long   l;
   int    base;
   unsigned long ul;

   string = "3.1415926This stopped it";
   x = strtod( string, &stopstring );



Это сообщение отредактировал(а) zim22 - 9.4.2009, 17:08


--------------------
PM MAIL   Вверх
azesmcar
Дата 9.4.2009, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



zim22, 
вот именно smile
char **endptr а не const **endptr

Цитата

azesmcar, это уже смешно. UnrealMan и вам поставил минус. добро пожаловать в клуб smile 

спасибо smile где тут присесть?
PM   Вверх
Anikmar
Дата 9.4.2009, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(azesmcar @  9.4.2009,  16:58 Найти цитируемый пост)
этот??? низачто не поверю, выдаст что-то вроде missing type specifier

Я уже понял - если тип не указан будет считать int
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0716 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.