Возможно ли иметь литерал-указатель?

В C могут быть строковые литералы в форме

char *string = "string here"; 

целые литералы:

 uint8_t num = 5; 

длинные литералы:

 long long bigNum = 90322L; 

Литералы с плавающей запятой:

 float decimal = 6.3f; 

Является ли способ иметь литерал-указатель? Это буквальный адрес в пространстве памяти. Я занимаюсь разработкой встроенного проекта и нуждаюсь в жестком кодировании значения для доступа DMA. Я делаю что-то похожее на следующее:

 uint32_t *source = 0x08000000; 

Хотя это компилируется и работает правильно, я получаю следующую ошибку компилятора (я использую вариант GCC ):

 cc0144: {D} warning: a value of type "int" cannot be used to initialize an entity of type "uint32_t *" cc0152: {D} warning: conversion of nonzero integer to pointer 

Есть ли правильный способ сделать это или мне просто нужно принять это как факт C? Я знаю, что могу сделать:

 uint32_t *source = (uint32_t *)0x08000000; 

Но это просто кажется ненужным. Каков промышленный способ сделать это? Мне также интересно, существует ли эта функция в C ++.

В C и C ++ единственный литерал или константа указателя равен нулю. Мы можем перейти к проекту стандарта C99 6.3.2.3 Указатели :

Целочисленное константное выражение со значением 0 или такое выражение, отлитое от типа void *, называется константой нулевого указателя. 55)

а также:

Целое число может быть преобразовано в любой тип указателя. За исключением, как указано ранее, результат определяется реализацией, может быть неправильно выровнен, может не указывать на объект ссылочного типа и может быть ловушечным представлением. 56)

правильный способ справиться с ненулевой целочисленной константой – использовать бросок.

Эквивалентный раздел из проекта стандарта C ++ , вероятно, будет содержать раздел 5.2.10 Реинтерпрет», в котором говорится:

Значение интегрального типа или типа enums может быть явно преобразовано в указатель. Указатель, преобразованный в целое число достаточного размера (если таковое существует в реализации) и обратно к тому же типу указателя будет иметь свое первоначальное значение; сопоставления между указателями и целыми числами определяются иначе. [Примечание. За исключением случаев, описанных в п. 3.7.4.3, результат такого преобразования не будет безопасным значением указателя. -End note]

Для всех деталей вы должны увидеть раздел 3.7.4.3 .

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

Литералом указателя является ключевое слово nullptr. Это prvalue типа std :: nullptr_t. [Примечание: std :: nullptr_t – это отдельный тип, который не является ни типом указателя, ни указателем на тип члена; скорее, prvalue этого типа является константой нулевого указателя и может быть преобразовано в значение нулевого указателя или значение указателя нулевого элемента. См. 4.10 и 4.11. -End note]

Нет, это не так. Это потому, что литералы являются допустимыми значениями, и единственными действительными указателями являются адреса объектов, т. Е. Результат операций адреса или арифметики указателя на действительных указателях.

Вы можете утверждать, что nullptr слово nullptr предоставляет своего рода «литерал-указатель»; стандарт C ++ называет это. Это, однако, единственный литерал-указатель, иронически это не тип указателя.