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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение строки по указателю 
V
    Опции темы
Hukuma
Дата 2.11.2010, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте. Объясните, пожалуйста, следующее поведение, я туманно представляю себе почему так получается, но сам себя убедить в этом не могу. Мне нужно в функции f изменить строку s так, чтобы при выводе на экран в функции main строки str её значение было "str2"

Код


void f(char *s) {

      s="str2";
      return;
}

int main() {

    char *str="str1";
    f(str);
    printf("str=%s\n",str)
    return 0;

}


в этом случае вывод: str=str1

Если же написать так

Код


void f(char **s) {

      *s="str2";
      return;
}

int main() {

    char *str="str1";
    f(&str);
    printf("str=%s\n",str)
    return 0;

}


то вывод будет str=str2 - то, что мне нужно

конкретно я не понимаю, почему первый вариант кода не срабатывает, я же передаю указатель на строку, затем этот же указатель изменяю в функции -> строка в функции main тоже должна измениться. Или ошибка моих рассуждений в том, что когда я подаю указатель 
на строку в функции f, а затем записываю новое значение в строку, на которую он указывает, то я изменяю копию указателя, которая передается в функцию f? Я же его не разыменовываю -> не обращаюсь к участку памяти, на который указывает указатель s в функции f?

я примерно так объясняю себе то, почему первый вариант не срабатывает, но уверенности нет. Объясните, пожалуйста мне. 




PM MAIL   Вверх
bsa
Дата 2.11.2010, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Строка 9 твоего кода содержит ошибку, на которую компилятор ради совместимости со старым кодом не особо ругается. Строка в двойных кавычках называется строковым литералом и является КОНСТАНТОЙ (т.е. МЕНЯТЬ ее НЕЛЬЗЯ). Поэтому твою 9-ю строку нужно переписать так:
Код
const char *str="str1";
А дальше уже компилятор тебе все объяснит.

Добавлено через 1 минуту и 3 секунды
Кстати, чтобы все заработало, достаточно написать так:
Код
char str[]="str1";
Но это уже называется по-другому: создать массив символов str и проинициализировать его значением "str1".
PM   Вверх
Hukuma
Дата 2.11.2010, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



bsa, спасибо за ответ, покопался ещё немного и разобрался. Спасибо за замечание насчет const char, я действительно совсем забыл про это. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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