У меня вопрос по поводу ключевого слова register
в C.
Я обнаружил, что register
имя массива (например, array
) может быть назначено переменной указателя, в то время как &array[0]
не может быть.
Можете ли вы объяснить, почему имя массива может быть присвоено указателю?Или, если кто-то уже объяснил это, пожалуйста, дайте мне знать ссылки, чтобы я мог посмотреть, чтобы получить ответ.Спасибо.
Вот что я попробовал:
Я прочитал cppreference , который объясняет ключевое слово register
и говорит:
массивы регистров не могут быть преобразованы в указатели.
Также я читаю черновик C89, в котором говорится:
Реализация может обрабатывать любое объявление регистра просто какАвто декларация.Однако, независимо от того, используется ли на самом деле адресуемое хранилище, адрес любой части объекта, объявленной с помощью регистра спецификатора класса хранилища, не может быть вычислен , либо явно (с использованием унарного оператора &, как обсуждалось в3.3.3.2) или неявно (путем преобразования имени массива в указатель, как описано в 3.2.2.1). Таким образом, единственный оператор, который может быть применен к массиву, объявленному с помощью регистра спецификатора класса хранения, - это sizeof.
Похоже, я не могу присвоить имя массива регистров указателю, чтобы получить его адрес.
Кроме того, чтобы найти ответ, я искал здесь и нашел этот вопрос: Адрес регистровой переменной .Есть хорошие ответы, однако я так и не смог найти ответ, который хотел.
Вот код, который я тестировал.Я скомпилировал этот код через Clang с флагом -std=c89
:
register int array[10];
int* p;
p = array; // Compiled without warning or error
p = &array[0]; // Compiled with error which I expected
Я ожидал, что и p = array;
, и p = &array[0];
вызвали скомпилированную ошибку, но только p = &array[0];
допустил ошибку компиляции.