Модераторы: 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   Вверх
zim22
Дата 9.4.2009, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(azesmcar @  9.4.2009,  17:07 Найти цитируемый пост)
char **endptr а не const **endptr

тюты, нуты. я количество звёздочек считал, и не обращал внимания на const или char smile


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


Эксперт
****


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

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



Цитата(zim22 @  9.4.2009,  17:04 Найти цитируемый пост)
azesmcar, это уже смешно. UnrealMan и вам поставил минус. добро пожаловать в клуб  

Была бы его воля, он бы по 10 минусов в день ставил каждому  smile 


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


Шустрый
*


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

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



     Спасибо! Там действительно во 2-м параметре char **end.
Внимательно читаю все ваши посты  сейчас. Просветление вроде наступает smile 
PM MAIL   Вверх
mes
Дата 9.4.2009, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Anikmar @  9.4.2009,  16:08 Найти цитируемый пост)
Я уже понял - если тип не указан будет считать int 

так делают только некоторые компиляторы (помойму и не всегда)

Добавлено через 2 минуты и 38 секунд
Цитата(Anikmar @  9.4.2009,  16:10 Найти цитируемый пост)

Была бы его воля, он бы по 10 минусов в день ставил каждому  smile 

Обидно только, что человек с хорошим багажом знаний ведет себя как партизан.  smile 

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


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


Эксперт
****


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

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



Цитата(mes @  9.4.2009,  17:16 Найти цитируемый пост)
так делают только некоторые компиляторы (помойму и не всегда)

Я так понимаю только в случае режима совместимости с С. Там по умолчанию int предполагался вроде как.

Ну суть не меняется - скомпилироваться может и скомпилируется, ясно, что ошибка в прототипе - бессмыслица. Выяснили.

А указатель на указатель нужен для того, чтобы показать на каком символе строки остановилась проверка.
PM MAIL ICQ   Вверх
azesmcar
Дата 9.4.2009, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата

Обидно только, что человек с хорошим багажом знаний ведет себя как партизан.  smile 

да, но надо бы понять что мы тут не книги пишем..когда новичку что-то пишешь надо писать максимально понятными терминами а не впадать в экстаз и использовать весь словарным запас подчерпанный из стандарта С++ и книг Александреску

Добавлено через 1 минуту и 5 секунд
Цитата

так делают только некоторые компиляторы (помойму и не всегда)

студия 2008 этого не поддерживает, 6-ой вроде поддерживал, но по любому это не верно так писать.
PM   Вверх
Anikmar
Дата 9.4.2009, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



UnrealMan поставил минус azesmcar-у с комментарием:
Указатель - это объект, а переменная - это именованный объект. Указатель может не иметь имени.
 
Если честно, я не понял в чем предъява. Исправляю.
PM MAIL ICQ   Вверх
azesmcar
Дата 9.4.2009, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Anikmar

предъява в том что я написал
Цитата

Указатель это тоже переменная, и она тоже занимает место в памяти (и там записан указатель). И у этой переменной тоже есть адрес.


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


Эксперт
****


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

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



Цитата(azesmcar @  9.4.2009,  17:32 Найти цитируемый пост)
просто речь шла об именованном указателе а не абстрактном понятии указатель..
char *b;
b - это переменная. и у нее есть адрес. 


Лично я эту фразу понял и с ней согласен. Видимо UnrealMan не понял о чем речь.

 smile 
На самом деле UnrealMan занятная личность. На форуме скрыт, последний раз участвовал в дискуссии в январе, с тех пор сидит втихаря и минусы ставит. Предполагаю из-за своего счетчика сообщений - у него 666 сообщений  smile .

Видимо нравится ему быть неким "темным кардиналом".


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


Шустрый
*


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

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



Если я правильно понял - указатель на указатель нужен для того чтобы изменить указатель  который при вызове этой функции я ввожу.
Правильно?

Это чо же получается - эта функция  возвращает указатель end , как и возвращаемое значение long int?

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


Эксперт
****


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

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



Цитата(and277 @  9.4.2009,  17:39 Найти цитируемый пост)
Это чо же получается - эта функция  возвращает указатель end , как и возвращаемое значение long int?

Я не смотрел описание этой функции - высказываю догадку:
В end будет указатель, который указывает на первый символ после найденного long.

Наверное для этого. Может понадобится для следующего преобразования. А само возвращаемое - это собственно результат преобразования.

Может я не прав - нет под рукой хелпа.

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


Шустрый
*


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

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



Anikmar, про первый символ прав 100 пудов.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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