Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/75: Рейтинг темы: голосов - 75, средняя оценка - 4.85
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1

Инициализация строки

16.05.2016, 10:47. Показов 15184. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, такое дело: имеется инициализация
C++
1
char* str1 = "x"; // lvalue - char*, rvalue = const char[2]
такая инициализация есть темное наследие чистого Си, но вместе с этим rvalue приводится к char*

C++
1
const char str2[] = "y"; // lvalue - const char[], rvalue = const char[2]
таким образом, тип const char[] инициализируется типом char[2]

В силу последнего, можно полагать, что:
C++
1
const char str3[] = str2; // lvalue - const char[], rvalue = const char[2]
но происходит ошибка компиляции.

Можете объяснить?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.05.2016, 10:47
Ответы с готовыми решениями:

Инициализация строки - задачка
Сама задачка от Kastaneda: #include <string> #include <iostream> using namespace std; #define DEBUG( str ) do{ cout <<...

Инициализация строки и запись ее в файл
нужно написать программу, которая инициализирует какую-либо строку и записывает ее в файл test.txt, помогите, пожалуйста!)

Инициализация длинной константной строки
Нужно офомить строку в несколько строк с переводом на новую строку. char string = "nznznznznznznz r\n\\ znznnznzznznznznzn...

35
Заблокирован
16.05.2016, 20:03
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
const char str3[] = str2;
- может к константе нельзя переменную присваивать?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
16.05.2016, 20:05
Цитата Сообщение от Programmist5 Посмотреть сообщение
- может к константе нельзя переменную присваивать?
В объявлении - можно. Если, конечно, это не сишные строки, где даже "1234"=="1234" дает непредсказуемый результат.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
16.05.2016, 20:08
Ferrari F1, какая разница на какой колокольне ты сидишь, если это - термин/понятие/определение
есть понятие переменной, а есть понятие литерала. это разные термины для орпеделения конкретных вещей
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
16.05.2016, 20:11
Цитата Сообщение от retmas Посмотреть сообщение
Ferrari F1, какая разница на какой колокольне ты сидишь, если это - термин/понятие/определение
есть понятие переменной, а есть понятие литерала. это разные термины для орпеделения конкретных вещей
А теперь ответьте почему вот так можно:
C++
1
2
const int str1=1234;
const int str2=str1;
А вот так нельзя:
C++
1
2
const char str1[]="1234";
const char str2[]=str1;
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
16.05.2016, 20:16
кто в лес, кто по дрова...
я говорю о терминологии, другой про правила языка, третий про представление...
0
4 / 4 / 1
Регистрация: 04.04.2016
Сообщений: 23
16.05.2016, 20:16
так вродеж писал это масивы, а масив масиву присвоить нельзя.

и так можно
C++
1
2
const char str1='1';
const char str2=str1;
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
16.05.2016, 20:19  [ТС]
thebat_ua, можно
C++
1
const char str2[] = "y"; // lvalue - const char[], rvalue = const char[2]
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
16.05.2016, 20:20
Цитата Сообщение от thebat_ua Посмотреть сообщение
так вродеж писал это масивы, а масив масиву присвоить нельзя.
А это что по вашему, если не присвоение массива-литерала?
C++
1
const char str[]={'1','2','3','4',0};
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
16.05.2016, 20:26  [ТС]
Renji, у меня родилась такая мысль, что строковый литерал может располагаться не в сегменте данных, а в сегменте кода.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
16.05.2016, 20:28
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Renji, у меня родилась такая мысль, что строковый литерал находится не в сегменте данных, а в сегменте кода.
Он находится в R/O памяти, на которую и берется ссылка в конструкциях типа const char*str="1234";. А сегментов кода давно уже нет, плоская модель памяти съела.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
16.05.2016, 20:41
Renji, то ли я вас не понимаю, то ли вы перемудрили
Цитата Сообщение от retmas Посмотреть сообщение
str1 - это переменная
"x" - строковый литерал
эти понятия нужно различать
Цитата Сообщение от Renji Посмотреть сообщение
Нет, не нужно их различать.
Цитата Сообщение от Renji Посмотреть сообщение
А теперь ответьте почему
...
А вот так нельзя:
C++
1
2
const char str1[]="1234";
const char str2[]=str1;
как то непоследовательно.
если горим, что массив char можно инициализировать строковым литералом,но нельзя массивом(переменной), то нужно ли эти термины различать?
0
4 / 4 / 1
Регистрация: 04.04.2016
Сообщений: 23
16.05.2016, 20:45
Renji
Почему тогда не задают вопрос о не работоспосбности такого кода
C++
1
2
const int  str1[] = {1,0};
const int str2[] = str1;
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
16.05.2016, 20:50
Цитата Сообщение от Renji Посмотреть сообщение
А это что по вашему, если не присвоение массива-литерала?
C++
1
const char str[]={'1','2','3','4',0};
ясно почему у нас нет взаимопонимания. раз нет понимания терминологии. что такое массив-литерал?
я вижу список инициализации, который состоит из литералов.
вроде придираюсь, кто-то скажет... может и так. но вот такое отношение к терминам может повредить пониманию вас собеседником. будет неприятно, если это произойдет, например, на собеседовании.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
16.05.2016, 20:55
Цитата Сообщение от retmas Посмотреть сообщение
если горим, что массив char можно инициализировать строковым литералом,но нельзя массивом(переменной), то нужно ли эти термины различать?
По хорошему нужно выкидывать подобные рудименты и разрешать нормальное копирование массивов. А про нынешнюю ситуацию надо просто запомнить что это очередное наследие Си, здравому смыслу не поддающееся. Ну, разве что в топик придет аксакал лично программировавший еще на Би и расскажет на кой черт вся эта ерунда была нужна этак полвека тому назад.
Цитата Сообщение от thebat_ua Посмотреть сообщение
Почему тогда не задают вопрос о не работоспосбности такого кода
Потому что такой код реже используется.
0
 Аватар для SergioO
261 / 209 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
17.05.2016, 10:59
Цитата Сообщение от Renji Посмотреть сообщение
По хорошему нужно выкидывать подобные рудименты и разрешать нормальное копирование массивов
и как вы себе это представляете? как это копировать массив?
C
1
2
3
for (int i=0; i < i.size(); i++){
a[i] = b[i]
}
или есть другие механизмы?
Цитата Сообщение от Renji Посмотреть сообщение
что это очередное наследие Си, здравому смыслу не поддающееся
надо понимать просто что в Си "нет массивов", а есть указатели
и arr есть не что иное как &arr[0]
можно ведь к элементам массива обратиться *(arr+n)
или char **argv и char *argv[]
как вы хотите присвоить? чтобы было arr1 = arr2?
и что получалось бы? arr1 и arr2 два указателя на один массив
и вопрос не темного прошлого. как вы имея 3 ячейки {14, 4, 59} продублируете их (те скопируете?) как по-вашему вы организуете тип массив, чтобы так, на раз копировалось? причем без потери общности операции присваивания - ведь в Си нельзя перегружать оператор присваивания.
в Java тоже не нашлись как это решить... Да, в контейнерах типа массивы, векторы и тп перегружают оператор присваивания, но(!) в итоге за этим оператором все равно стоит цикл for() и чего добились спрашивается?
имхо как-то так...
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.05.2016, 11:06
Цитата Сообщение от SergioO Посмотреть сообщение
надо понимать просто что в Си "нет массивов", а есть указатели
В Си есть переменные с типом typedef int(array)[10];, которые Си неизвестно за каким хреном пытается преобразовать к указателям. Тем не менее, sizeof(array)!=sizeof(void*).
Цитата Сообщение от SergioO Посмотреть сообщение
и как вы себе это представляете? как это копировать массив?
C++
1
2
3
int src[10];
int dst[10];
memcpy(dst,src,sizeof(src));
Чрезвычайно сложно было реализовать на уровне синтаксиса, а не memcpy костыля, да.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.05.2016, 11:06
Помогаю со студенческими работами здесь

Инициализация массива. Длина строки
Ребят, добрый день. Ломаю голову и не могу сообразить, как в массив занести не констант. строчку? Ну т.е не константой, например: mas...

Инициализация поля класса (строки в стиле Си): найти причину возникновения ошибки и исправить эту ошибку
Начинаю учить C++ и хочу сделать что-то типо &quot;игры&quot; в текстовом варианте. Вот столкнулся с проблемой - хранение бонусов при ответе,...

Инициализация строки
При создании массива строк в объектном стиле, например, string str = new string Изначально каждая строка имеет значение...

Инициализация строки
Всем привет! Не могу понять, где ошибка( Если я ввожу два символа, например XX, то он выводит значение только первого.. т.е. только 10.....

Безопасная инициализация строки
Здравствуйте. Я разработчик игры на С. В данный момент пишу античит для неё. При обнаружении чита клиента выбрасывает в главное меню с...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru