![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
LiRienko |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 10.9.2014 Репутация: нет Всего: нет |
Подскажите мне пожалуйста, насколько правильно определять указатель на строку таким образом:
Или все-таки лучше определять указатель на строку так
|
||||
|
|||||
feodorv |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Все зависит от того, что вы с этой строкой будете делать. Если собираетесь ее менять, то первый вариант никак не подходит: Потому что область памяти, которая будет содержать в себе строку "First string!", будет доступна (скорее всего) только для чтения. Запись в неё приведет к краху программы. Второй вариант:
возможен, но какой-то он корявый. Почему не просто:
И высвобождать память потом не понадобится. Если потом собираетесь менять содержимое pStr, то всегда нужно помнить, что под строку "First string!" отведено ограниченное число байт. Если же строка не будет меняться, то первый вариант (с учетом const) вполне подходит. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||
|
|||||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 5 Всего: 160 |
Так, ну, судя по new это C++. Со строками в С++ надо работать посредством класса std::string cтандартной библиотеки. Сишечные извращения оставьте сишникам.
![]() Это сообщение отредактировал(а) kemiisto - 10.9.2014, 11:41 -------------------- |
|||
|
||||
LiRienko |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 10.9.2014 Репутация: нет Всего: нет |
А если есть допустим такая задача: Написать свою функцию для объединения двух строк. Если использовать обычные символьные массивы, то надо всегда задавать размер с запасом, для того чтобы вместить в нем вторую строку. Наверное тут лучше использовать указатели на строки, передать их в свою функцию. В ней перевыделить память для первой строки, дописать в нее вторую и вернуть указатель на этот новый участок памяти. Добавлено через 2 минуты и 53 секунды Вот к примеру
|
||||
|
|||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Ну тогда стоит добавить функцию для первоначального выделения памяти:
Но лучше пользоваться std::string, как советовал kemiisto, QString если пользуете Qt и т.п. |
|||
|
||||
feodorv |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Честно говоря, я в таком коде смысла не вижу. Вам даже приходится дважды упоминать один и тот же текст строк. В приведенном коде Вы первоначальные строки не меняете. Соответственно, можно позволить себе:
Это лишние телодвижения, которые вдобавок предполагают, что у Вас строки аллоцированные. А если нет? Я теперь не могу делать так:
Самое простое решение:
Здесь есть, конечно, что пооптимизировать и добавить, но идея, мне кажется, ясна. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||||
|
|||||||||
LiRienko |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 10.9.2014 Репутация: нет Всего: нет |
Спасибо всем за участие в этом обсуждении. Главное, что мне стало понятно - это то, что ничего страшного в указателях на строковую константу нет
и их можно спокойно применять в программе ))) А чтобы объединить такие строки, лучше объявить отдельный указатель и присвоить ему значение (адрес), которое вернет функция, объединяющая две строки. ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |