是否有可能有一个指针文字?

在C中,可以使用forms的字符串文字

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 ++中是否存在此function。

在C和C ++中,唯一的指针文字或常量为零。 我们可以参考草案C99标准部分6.3.2.3 指针

值为0的整型常量表达式或类型为void *的表达式称为空指针常量。 55)

和:

整数可以转换为任何指针类型。 除非先前指定,否则结果是实现定义的,可能未正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示。 56)

处理非零整数常量的正确方法是使用强制转换。

C ++标准草案中的等效部分可能是5.2.10 重新解释铸造 ,其中说:

可以将整数类型或枚举类型的值显式转换为指针。 转换为足够大小的整数(如果在实现上存在任何此类)并返回相同指针类型的指针将具有其原始值; 指针和整数之间的映射在其他方面是实现定义的。 [注意:除3.7.4.3中所述外,此类转换的结果不是安全派生的指针值。 – 尾注]

您需要查看3.7.4.3节的所有详细信息。

对于指针文字参考,您需要2.14.7指针文字 ,其中说:

指针文字是关键字nullptr。 它是std :: nullptr_t类型的prvalue。 [注意:std :: nullptr_t是一个不同的类型,既不是指针类型也不是指向成员类型的指针; 相反,这种类型的prvalue是一个空指针常量,可以转换为空指针值或null成员指针值。 见4.10和4.11。 – 尾注]

不,这不对。 这是因为文字是有效值 ,唯一有效的指针是对象的地址,即操作地址或有效指针上的指针算法的结果。

你可以争辩说nullptr关键字提供了一种“指针文字”; C ++标准称之为。 然而它是唯一的指针文字,具有讽刺意味的是它不是指针类型。