Ниже массив постоянных символов. Он фактически содержит пять элементов, потому что язык C добавляет '\ 0' в конец строки, разделенной символами "
. В C объект массива, такой как MEAT
, фактически является указателем на первый элемент массива, поэтому MEAT на самом деле является адресом памяти, а не целым массивом символов!
const char[] MEAT = "Meat";
Ниже указателя к const char
. Символ *
сообщает вам, что это указатель.(Не имеет значения, ставите ли вы звезду по типу, на который указывает или по имени переменной. Это может сбивать с толку, поэтому я обычно храню информацию о типе вместе и имею имя самостоятельно, но я считаю, что это не является самым обычным соглашением.) Переменная favFood
инициализируется адресом первого символа в массиве MEAT
. (Помните, что MEAT
является адресом памяти, так это установка одного адреса памяти равным другому.)
const char* favFood = MEAT;
В какой-то момент в будущем, ваше животное может внезапно решить, что он больше не любит мясо, и теперь он на самом деле предпочитает печенье (более вероятно, что кошка изменит свое мнение, чем собака, я знаю, но это всего лишь пример).
const char BISCUITS[] = "Biscuits";
/* Some code is done here, until you find... */
favFood = BISCUITS;
Теперь, как MEAT
и BISCUITS
постоянны, что означает, что вы не можете изменить их, но favFood
сама по себе не постоянна, но указывает на постоянной строки (первый символ в строке в любом случае), так что вы можете изменить его !
Вы также можете иметь непостоянные строки:
char nameAndFaveFood[50];
sprintf(nameAndFaveFood, "%.26s likes %.9s best.", name, favFood);
... но убедитесь, что вы не копировать больше символов - включая завершающий «\ 0» нулевой символ - чем вы выделили пространство, в этом случае 49 символов и терминатор. Вот почему функция sprint
имеет спецификаторы точности для ограничения длины подстроки.
И вы можете иметь постоянные указатели на сменную память.
char* const LIKES_FOOD = &nameAndFaveFood[27];
Обратите внимание, что объект LIKES_FOOD
инициализируется, чтобы указать часть пути через nameAndFaveFood
массива. Он всегда укажет на этот адрес. Вы можете вызвать процедуру в предыдущем блоке кода с различными параметрами name
и favFood
, но LIKES_FOOD
всегда укажет на 28-й символ в массиве nameAndFaveFood
.
Я понял, что он указывает где-то, но я не понимаю, как это можно использовать для извлечения строки, например, я могу использовать ее для хранения «Мясо» и вернуть ее с помощью «theDog.dogFaves.favFood», shouldn 't это просто возвращает один символ' M ', а не строку? – fdbdcbc
@ MGordon0405 - 'theDog.dogFaves.favFood' ничего не возвращает. Он ** оценивает ** на адрес первого символа в строке, а не на сам символ. – StoryTeller
@ MGordon0405 - Забудьте о строках на данный момент. Вы понимаете, почему передать массив целых чисел функции, указатель на первый элемент и длина массива - это все, что нужно? – StoryTeller