2013-11-13 3 views
4

Я не могу понять, как это работает.Почему вы можете поместить несколько символов в C++ char *

// This doesn't work (obviously) 
char a; 
a = "aaa"; 

// This works 
char* a; 
a = "aaa"; 

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

С char тип хранит только один символ или 1 байт, как вы можете хранить в нем больше символов, когда вы получаете к нему доступ через указатель?

+2

Фактически, это не работает с последним стандартом C++. – chris

+0

@chris будет работать, если вместо этого будет изменен на 'const char * a;'? – greatwolf

+0

@ greatwolf, Да, это было бы. – chris

ответ

8

Вы не помещаете символы в char*. Вы создаете массив символов в части памяти, определенный вашим компилятором, и указываете char* на первый символ этого массива.

Массив на самом деле является константой, поэтому вы не сможете назначить его указателю, не содержащему константы. Но по историческим причинам вы все еще можете использовать многие версии C++. Однако он официально был незаконным в C++ 11.

+3

И присвоение его таким образом (строковый литерал 'char *'), в простых выражениях, не рекомендуется. –

+0

Хорошо, я понимаю это сейчас. Я действительно не использую его таким образом, но мне было интересно, что там происходит. Разве это не соответствует другим типам данных или есть что-то, чего я не вижу? –

+0

@ Python-: Он согласуется с поведением указателей и массивов в целом (игнорируя проблемы const). То есть, если у вас есть массив 'T', называемый' arr', а 'T *', называемый 'ptr', назначение:' ptr = arr; 'является законным и присваивает' ptr' указание на ' обр [0] '. Тем не менее, указатели и массивы *, особенно * массивы, имеют много способов поведения, которые не согласуются с поведением нормальных объектов, и вам следует избегать их, чтобы избежать их, если вы не знакомы со своими задачами. –

2

Второй - указатель на строку символов, а не один символ. Tutorial.

+1

Он по-прежнему является указателем на один символ. Этот символ интерпретируется как первый из строки. – chris

+0

@kmort: Технически это указатель на 'char', а не на строку' char'. Только если заостренная память является последовательностью 'char', заканчивающейся символом' \ 0', то последовательность является «строкой» в терминологии C. –

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