2015-12-05 4 views
5

Обычно при объявлении указателя (например, целое число), вы должны назначить адрес памяти к нему:Почему вы можете назначить массив указателю на char?

int value = 123; 
int* p = &value; 

При создании указателя обугленного, вы можете присвоить массив символов в ней без необходимо указать адрес:

char* c = "Char Array"; 

Как это работает? Он выделяет память и указывает на это? Почему другие указатели типа не могут делать то же самое?

+0

Вы не можете сделать это, например: 'char * c = &'a';' –

+0

Обратите внимание, что 'char * c =" char array "' не будет компилироваться в C++; вы хотели спросить о C, а? – edmz

+0

@ Daniel Ваш компилятор C++ отстой, если он, по крайней мере, не дает вам предупреждения. –

ответ

7

Как это работает?

Строковый литерал хранится в секции данных только для чтения в исполняемый файл (то есть он инициализируется во время компиляции) и c инициализируется, чтобы указать на эту ячейку памяти. Неявный array-to-pointer conversion обрабатывает остальное.

Обратите внимание, что преобразование строковых литералов в char* устарело, потому что содержимое в любом случае доступно для чтения; предпочитают const char* при указании на строковые литералы.

Связанная конструкция, char c[] = "Char Array";, скопировала содержимое строкового литерала в массив char во время выполнения.

Почему другие указатели типа не могут делать то же самое?

Это особый случай для строковых литералов, для удобства, унаследованный от С.

1

Другие указатели типа могут сделать это также просто отлично. Строковый литерал - это массив символов, поэтому вам не нужно использовать оператор адреса для назначения указателю.

Если у вас есть целочисленный массив, либо INT * или Int [] вы можете назначить его Int указателя, не используя оператор адреса, а также:

int intArray1[] = {0, 1, 2}; // fist array 
int * intArray2 = new int[10]; // second array 
// can assign without & operator 
int * p1 = intArray1; 
int * p2 = intArray2; 

char * просто специфичен, что строковый литерал типа на самом деле const char * и до сих пор разрешено назначать (с предупреждением об отказоустойчивом преобразовании).

Смежные вопросы