char *ptr = &"Hello";
Ваш компилятор должен был предупредить вас об этом. "Hello"
имеет тип char[6]
(длина строки плюс 1 для завершающего '\0'
null символ). Таким образом, &"Hello"
имеет тип char (*)[6]
, или указатель на массив из 6 char
. Нет никакого неявного преобразования из этого типа в char*
.
Если вы хотите указатель на строку, падение &
:
const char *ptr = "Hello";
Это использует правило, что выражение типа массива (например, "Hello"
неявно преобразуется в указатель на массив сначала элемент. (Это преобразование не выполняется, если массив является операнд одноместной &
или sizeof
оператора, или строковый литерал используется для инициализации объекта массива.)
(я добавил const
, потому что это безопаснее , вы не можете юридически изменять содержимое o f строковый литерал, а const
напоминает компилятору, чтобы вы не попробовали. Спасибо, что напомнили мне Батшеву.) (На самом деле изменение содержания имеет неопределенное поведение.)
Вы заметите, что ptr
указывает на первый символ строки, а не на всю строку. Это (возможно) именно то, что вы хотите. В C массив обычно обрабатывается с помощью указателя на его элементы, а не с помощью указателя на весь массив.Арифметика указателя используется для перемещения массива и доступа ко всем его элементам.
Важно помнить, что при построении указателя на исходный элемент массива не запоминается размер массива. Вы должны сами следить за этим. Если массив содержит строку, вы обычно будете искать завершающий '\0'
или использовать функцию, которая делает это. Для других массивов обычно хранить длину отдельно. Например, функция может принимать два аргумента, адрес начального элемента массива и целое число (size_t
), содержащее количество элементов.
Предлагаемое чтение: Раздел 6 comp.lang.c FAQ.
Плюс один, хотя я бы скорее посмотрел 'const char * ptr'. – Bathsheba
@ Батшеба: Хорошо, я обновил свой ответ. –