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