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

时间:2014-06-13 19:42:37

标签: c++ c pointers literals

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

3 个答案:

答案 0 :(得分:9)

在C和C ++中,唯一的指针文字或常量为零。我们可以转到draft C99 standard部分6.3.2.3 指针

  

值为0的整型常量表达式,或此类表达式   强制转换为void *,称为空指针常量。 55)

  

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

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

draft C++ standard中的等效部分可能是5.2.10 重新解释演员部分,其中包含:

  

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

您需要查看3.7.4.3部分了解所有详细信息。

对于指针文字参考,您需要部分2.14.7 指针文字,其中包含:

  

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

在C ++中,您可以执行以下操作吗?

uint32_t * source = reinterpret_cast<uint32_t*>(0x08000000);