Сообщение от miwutka
|
Я со строками никогда не работал поэтому туго понимаю еще.
|
Окей. Строка - это массив элементов типа
char, обычно заканчивающихся нулём. В Си нет отдельной строковой переменной, поэтому строки представляются именно так, а записываются в двойных кавычках:
"Это строка". При этом, в конце строки будет добавлен 0, по которому определяется конец строки.
Строку можно объявить как массив и как указатель.
При объявлении строки как массива
char message1[] = {"Hello"}, будет создан массив последовательных однобайтных элементов, в которые сразу записаны коды указанных в {" "} букв, и в конце еще один элемент, содержащий 0.
При объявлении строки как указателя
char *message = "Hello" будет создан массив однобайтных элементов, аналогично предыдущему случаю, и еще, по другому адресу, будет создана 4-байтная переменная, хранящая адрес первого элемента созданного массива. Эта переменная
*message - указатель на первый элемент созданного массива (строки).
Вот так:
Нажмите, чтобы открыть спойлер
===============================================
===============================================
Однако, если строку (массив элементов) объявить константной
const char *message = "Hello";
, то теперь сами элементы строки будут помещены в ПЗУ (флеш) и не будут отнимать место в ОЗУ. Однако, указатель на строку остается неконстантным и находится в ОЗУ, что позволяет работать с указателем на строку.
Вот, это что касалось прединициализованных строк, содержащих фиксированный текст.
Теперь что касается строк, содержащих переменные, принятые извне, изменяемые значения.
Здесь всё аналогично, за исключением того, что это неконстантные (изменяемые), не инициализованные при создании массивы.
Обычно такой массив зовется буфером, хотя не принципиально.
Объявить буфер можно массивом фиксированной длинны
char buf[10].
Вот слева - буфер, содержащий принятое слово с начала буфера, справа - инициализованная строка:
Нажмите, чтобы открыть спойлер
Работать с буфером можно либо через индекс массива, либо через указатель. Указатель на начало массива:
char *buf_ptr = buf
Ну а дальше идет обычная работа с указателями:
char var;
var = *buf_ptr; // чтение в переменную var из буфера по указателю
*buf_ptr = var; // запись из переменной var в буфер по указателю
var = *buf_ptr++; // чтение в переменную из буфера, с последующим инкрементом указателя
buf_ptr += 5; // указатель на 5 позиций вперед
buf_ptr -= 2; // указатель на 2 позиции назад (от предыдущей позиции!)
Таким образом, работа со строками - это работа с указателями. Хотя можно работать со строками как с массивами и их индексами. Только это медленнее идет.
Что касается \n\r - это управляющая последовательность символов -
http://ru.cppreference.com/w/cpp/language/escape