Как объявить строки в C

Возможный дубликат:
Распределение памяти char * и char []

Может ли кто-нибудь объяснить мне, какая разница между этими строками кода

char *p = "String";
char p2[] = "String";
char p3[7] = "String";

В каком случае я должен использовать каждое из указанных выше?

Ответ 1

Эта ссылка должна удовлетворять ваше любопытство.

В принципе (забыв твой третий пример, который плохой), разные между 1 и 2 - это то, что 1 выделяет пространство для указателя на массив.

Но в коде вы можете манипулировать ими как указатели все равно - только одно, вы не можете перераспределить второй.

Ответ 2

Строки в C представлены как массивы символов.

char *p = "String";

Вы объявляете указатель, указывающий на строку, хранящуюся где-то в вашей программе (изменение этой строки - поведение undefined) в соответствии с языком программирования C 2 ed.

char p2[] = "String";

Вы объявляете массив char, инициализированный строкой "String" , оставляя компилятору задание для подсчета размера массива.

char p3[5] = "String";

Вы объявляете массив размером 5 и инициализируете его "String" . Это ошибка, потому что "String" не вписывается в 5 элементов.

char p3[7] = "String"; является правильной декларацией ('\ 0' является завершающим символом в строках c).

http://c-faq.com/~scs/cclass/notes/sx8.html

Ответ 3

Вы не должны использовать третий, потому что это неправильно. "String" занимает 7 байтов, а не 5.

Первый - это указатель (может быть переназначен на другой адрес), два других объявлены как массивы и не могут быть переназначены в разные ячейки памяти (но их содержимое может измениться, используйте const, чтобы этого избежать).

Ответ 4

char *p = "String";   means pointer to a string type variable.

char p3[5] = "String"; означает, что вы предварительно определяете размер массива, состоящий не более чем из 5 элементов. Обратите внимание, что для строк нулевой "\ 0" также рассматривается как элемент. Таким образом, этот оператор дал бы ошибку, так как число элементов равно 7, поэтому оно должно быть:

char p3[7]= "String";