Курсы создания компьютерных игр на C/C++ ( Часть 6 )

Для самых-самых начинающих программистов :] Часть 5.5 - http://pikabu.ru/story/_3453747
Курсы создания компьютерных игр на C/C++ ( Часть 6 ) Для самых-самых начинающих программистов :]  Часть 5.5 - <a href="http://pikabu.ru/story/kursyi_sozdaniya_kompyuternyikh_igr_na_cc__chast_55__3453747">http://pikabu.ru/story/_3453747</a>
Вы смотрите срез комментариев. Показать все
Автор поста оценил этот комментарий

добрые люди, объясните пожалуйста человеческим языком что это означает:

const char* WeaponName_None = "None";


Значит ли это, что в указателе "WeaponName_None" хранится адрес памяти где должна быть сохранена строка "None", но никакой переменной с таким значеним нет? Т.е. имеется область памяти занятая данными, но не имеющая имени? Зачем?

раскрыть ветку (11)
2
Автор поста оценил этот комментарий

Так и есть :)

Это указатель на строковую константу неимеющую имени :)

Это просто удобный способ создать несколько глобальных константных строк.


Если интересно, можно вот тут почитать про такие тонкости:

http://www.cyberforum.ru/blogs/18334/blog97.html

раскрыть ветку (10)
Автор поста оценил этот комментарий

прочёл. спасибо. Как я понял, такой финт ушами только для строковых литералов нужен, да?

раскрыть ветку (9)
1
Автор поста оценил этот комментарий
По сути да :) Да и только пока для нашего обучения ))

Перейдем на С++ и ООП будем использовать std::string объекты :)

раскрыть ветку (8)
Автор поста оценил этот комментарий

а почему здесь нельзя использовать string? статья хорошая, спасибо.

раскрыть ветку (7)
1
Автор поста оценил этот комментарий
да пользуйтесь, кто ж запрещал? Это ж просто уже несколько другой уровень :)
раскрыть ветку (6)
Автор поста оценил этот комментарий

а в чем суть использования строк именно таким образом? для какой-то оптимизации?

раскрыть ветку (5)
3
Автор поста оценил этот комментарий

Суть в том, что std::string - это класс (точнее даже конкретная версия шаблонного типа - std::basic_string<char>), который сам по себе кое-что умеет. Например, сам управляет памятью - сам где-то хранит char-буфер, изменяет, копирует и даже освобождает. Есть кучка вспомогательных методов, вроде поиска подстроки. К этому буферу мы напрямую даже прикоснуться не имеем права - управляем только через итераторы и методы класса.

http://www.cplusplus.com/reference/string/string/


А в Си широко используются строки с нулем на конце. То есть тупой сырой массив, где логический конец строки обозначается следующим за ней символом '\0' (от него и до конца буфера все, включая другие нуль-символы, считается мусором и игнорируется строковыми функциями).


const char cstr[] = "САБАКА-КУСАКА";
char *str = (char*)malloc((strlen(cstr) + 1)*sizeof('Ю'));
strcpy(str, cstr);
// С|А|Б|А|К|А|-|К|У|С|А|К|А|\0


const cstr2[] = "Молоко";

strcpy(str, cstr2);
// М|о|л|о|к|о|\0|К|У|С|А|К|А|\0
printf("%s", str); // Молоко

Резюме: zero-terminated string оперировать проще, т.к. это обыкновенный массив. std::string - это хитромудрая штука со своими нюансами и использованием С++ во все поля, поэтому ТС предлагает ньюби научиться пользоваться языком постепенно.

раскрыть ветку (4)
5
Автор поста оценил этот комментарий

Развернутый ответ :)

Иллюстрация к комментарию
раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Иллюстрация к комментарию
Автор поста оценил этот комментарий

спасибо большое за такой ответ =)

пример я шушуть не понял, но в целом прояснилось.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Пример о том, как работает терминальный нуль в С-строках.


1) Выделяем достаточно памяти, копируем туда данные из литерала

2) В уже имеющуюся строку копируем данные из другого литерала

3) Любуемся, как printf игнорирует любые данные после первого же '\0'.


Кстати, часто у начинающего случается ситуация, когда он велосипедит строковые операции нуль-символа не оказывается в строковом буфере. Тогда printf выйдет за границы и пойдет бродить по памяти, попутно сбрасывая свой пусть в stdout, где среди каракуль могут попадаться интересные строки, которые не были затерты после другого процесса.


Пожалуйста)

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку