sec*_*ula 9 c c++ pointers literals
在C中,可以有一个字符串文字
char *string = "string here";
Run Code Online (Sandbox Code Playgroud)
整数文字:
uint8_t num = 5;
Run Code Online (Sandbox Code Playgroud)
长文字:
long long bigNum = 90322L;
Run Code Online (Sandbox Code Playgroud)
浮点文字:
float decimal = 6.3f;
Run Code Online (Sandbox Code Playgroud)
这是一种指针文字的方法吗?这是内存空间的文字地址.我正在做一些嵌入式项目的工作,需要硬编码DMA访问的值.我正在做类似以下的事情:
uint32_t *source = 0x08000000;
Run Code Online (Sandbox Code Playgroud)
虽然这编译并正常工作,我得到以下编译器错误(我正在使用的变体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
Run Code Online (Sandbox Code Playgroud)
有没有正确的方法来做到这一点,或者我只需要接受这个作为C的事实?我知道我能做到:
uint32_t *source = (uint32_t *)0x08000000;
Run Code Online (Sandbox Code Playgroud)
但这似乎是非常不必要的.这样做的行业方式是什么?我也想知道C++中是否存在此功能.
在C和C++中,唯一的指针文字或常量为零.我们可以去草案C99标准部分6.3.2.3 指针:
值为0的整型常量表达式或类型为void*的表达式称为空指针常量.55)
和:
整数可以转换为任何指针类型.除非先前指定,否则结果是实现定义的,可能未正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示.56)
处理非零整数常量的正确方法是使用强制转换.
C++标准草案的等效部分可能是5.2.10 Reinterpret cast部分,它说:
可以将整数类型或枚举类型的值显式转换为指针.转换为足够大小的整数(如果实现上存在任何此类)并返回相同指针类型的指针将具有其原始值; 指针和整数之间的映射在其他方面是实现定义的.[注意:除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. - 尾注]