Форум программистов, компьютерный форум CyberForum.ru

Недопонял... Помогите пожалуйста... Со строками... - C++

Восстановить пароль Регистрация
 
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
31.10.2011, 16:28     Недопонял... Помогите пожалуйста... Со строками... #1
Доброго всем времени суток. Что объявляет следующая строка?

C++
1
char *s;
Создаётся указатель на начало строки, например как на простой вектор, или же создаётся строка? Или и то и другое? Если создаётся указатель, он содержит в себе мусор, то есть может указывать на что-угодно -> изменяя строку, мы можем изменить любые данные. Я так думаю потому-что это происходит с указателями на, скажем, int. Да и потом, нельзя ли создать строку следующим образом и не парится:

C++
1
char s[100];
Ну или проще говоря:
C++
1
2
char *string;
*string = "smth"
равняется ли:

C++
1
char string[10] = "smth";
В чём различия этих двух записей? Помогите пожалуйста...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
31.10.2011, 16:36     Недопонял... Помогите пожалуйста... Со строками... #2
Цитата Сообщение от dimcoder Посмотреть сообщение
оброго всем времени суток. Что объявляет следующая строка?
char *s;
Указатель на символьный тип

Цитата Сообщение от dimcoder Посмотреть сообщение
char *string; *string = "smth"
Строковый литерал

Цитата Сообщение от dimcoder Посмотреть сообщение
char string[10] = "smth";
Массив символов.

Для каждой задачи нужно выбирать конкретное решение
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
31.10.2011, 16:41  [ТС]     Недопонял... Помогите пожалуйста... Со строками... #3
Цитата Сообщение от Dekio Посмотреть сообщение
char *string; *string = "smth"

Строковый литерал
А не сотрёт ли эта запись какие нибудь важные данные? Не укажет ли он на какую нибудь занятую область памяти?
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
31.10.2011, 16:41     Недопонял... Помогите пожалуйста... Со строками... #4
Цитата Сообщение от dimcoder Посмотреть сообщение
В чём различия этих двух записей? Помогите пожалуйста...
Первое константа, второе можно изменять.
Есть еще третий вариант
C
1
char * str = (char *) malloc( sizeof(char) * 10 );
Это если вы на С пишите.
На с++ все вышеперечисленные варианты в общем случае желательно не использовать.
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
31.10.2011, 16:42     Недопонял... Помогите пожалуйста... Со строками... #5
dimcoder, все зависит от того, как его использовать. В руках "одаренного человека" и обычный статический массив может стать смертельным оружием
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
31.10.2011, 16:46     Недопонял... Помогите пожалуйста... Со строками... #6
Цитата Сообщение от dimcoder Посмотреть сообщение
char *string;
*string = "smth";
ты где такое увидел? Во-первых, разыменование string даст тебе символ (char), которому ты пытаешься присвоить строку. Во-вторых, ты хочешь присвоить строке литерал (константу), так почему бы не объявить string с квалификатором const?
C
1
2
const char* string;
string = "smth";
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
31.10.2011, 17:00  [ТС]     Недопонял... Помогите пожалуйста... Со строками... #7
Повторю вопрос:
Цитата Сообщение от dimcoder Посмотреть сообщение
А не сотрёт ли эта запись какие нибудь важные данные? Не укажет ли он на какую нибудь занятую область памяти?
C++
1
2
const char* string;
string = "smth";
Тогда уж, наверное:

C++
1
const char *string = "smth";
?
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
31.10.2011, 17:09     Недопонял... Помогите пожалуйста... Со строками... #8
Цитата Сообщение от dimcoder Посмотреть сообщение
Повторю вопрос:
нет, но попытка записи по этому адресу приведет к неопределенному поведению программы

Цитата Сообщение от dimcoder Посмотреть сообщение
Тогда уж, наверное:
не вижу принципиальной разницы
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
31.10.2011, 17:18     Недопонял... Помогите пожалуйста... Со строками... #9
dimcoder, разница была бы в таком случае:
C++
1
2
const char * const string;
string = "smth";
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
29.11.2011, 17:58  [ТС]     Недопонял... Помогите пожалуйста... Со строками... #10
Извиняюсь, что долго не отвечал в своей же теме...
Цитата Сообщение от Nameless One Посмотреть сообщение
нет, но попытка записи по этому адресу приведет к неопределенному поведению программы
К какому неопределенному поведению?

Короче говоря, остался один вопрос:
C++
1
2
char *s;
s = "Hello world!"
Удалит какие нибудь данные?
PS Извиняюсь за глупые вопросы и тавтологию.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
29.11.2011, 18:04     Недопонял... Помогите пожалуйста... Со строками... #11
Цитата Сообщение от dimcoder Посмотреть сообщение
К какому неопределенному поведению?
это значит, что при выполнении такого кода может произойти что угодно. Первый же пример в википедии как раз относится к твоей теме: http://en.wikipedia.org/wiki/Undefin..._C_and_C.2B.2B

Цитата Сообщение от dimcoder Посмотреть сообщение
Удалит какие нибудь данные?
нет
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
29.11.2011, 18:05     Недопонял... Помогите пожалуйста... Со строками... #12
Цитата Сообщение от dimcoder Посмотреть сообщение
Удалит какие нибудь данные?
Не удалит, но делать так нельзя. "Hello world" в данном случае является строковым литералом и находится в области памяти "только для чтения". Указатель же не является константным.
C
1
2
const char *s = NULL;
s = "Hello world!"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2011, 13:30     Недопонял... Помогите пожалуйста... Со строками...
Еще ссылки по теме:

помогите со строками на С C++
Ребяты помогите со строками чуток разобраться. C++
Помогите пожалуйста. C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
02.12.2011, 13:30  [ТС]     Недопонял... Помогите пожалуйста... Со строками... #13
fasked, Nameless One, спасибо за ответы. Более-менее прояснилось
Yandex
Объявления
02.12.2011, 13:30     Недопонял... Помогите пожалуйста... Со строками...
Ответ Создать тему
Опции темы

Текущее время: 11:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru