是否可能有一个指针字面量
Is it possible to have a pointer literal?
在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++中,唯一的指针字面量或常量是零。我们可以参考C99标准草案6.3.2.3
指针:
值为0的整型常量表达式或此类表达式转换为void *类型,称为空指针常量55)
:
整型可以转换为任意指针类型。除了之前指定后,结果是实现定义的,也可能不是正确对齐,可能不指向引用的实体56)
处理非零整型常量的正确方法是使用强制类型转换。
c++标准草案中的等效部分可能是5.2.10
Reinterpret cast部分,其中说:
整型或枚举类型的值可以显式地转换为指针。转换为整数的指针足够的大小(如果实现中存在这样的大小)并返回相同的指针类型将具有其原始值;之间的映射指针和整数是由实现定义的。【注:除3.7.4.3中描述的情况外,这种转换的结果将不是安全派生的指针值。-end note]
您需要查看3.7.4.3
节了解所有细节。
对于指针字面量引用,您需要2.14.7
指针字面量部分,其中表示:
指针字面量是关键字nullptr。它是类型为std:: nullptr_t。[注:std::nullptr_t是一个不同的类型。既不是指针类型,也不是指向成员类型的指针;更确切地说,是一个右值此类型的是空指针常量,可以转换为空值指针值或空成员指针值。参见4.10和4.11。端注意]
不,它不是。这是因为字面量是有效的值,而唯一有效的指针是对象的地址,即在有效指针上进行寻址操作或指针算术的结果。
你可以认为nullptr
关键字提供了一种"指针字面量";c++标准这样称呼它。然而,它是唯一的指针字面量,讽刺的是,它不是指针类型。
在c++中你能做下面的事情吗?
uint32_t * source = reinterpret_cast<uint32_t*>(0x08000000);
- 函数向量_指针有不同的原型,我可以构建一个吗
- 我可以有一个 ELI5 作为参考和指针以及何时使用它们吗?
- C++中是否有一个函数可以为您获取指向该节点的所有指针的地址空间
- 如何获得GUID编码器,如果我在IMFTransform上有一个指针?
- 如果我有一个指向矢量元素的指针,而不是迭代器,如何删除它?
- 为什么我在C++中有一个空指针取消引用
- 为什么静态指针返回函数中有一个"静态"键?
- 从指向成员的指针的模板推导,其中至少有一个指向成员的指针是已知的
- 带有显式构造函数的智能指针使我有一个错误
- 删除指向排序的字符串阵列的指针会在运行后会有一个错误
- 难道不应该有一个类似于"this"的与名称无关的类指针供成员函数在C++中引用吗?
- 指针怎么能有一个字符串作为它的值
- 我可以有一个模板函数指针的 std::vector 吗?
- 如果我有一个将指针变量作为输入的函数,有没有办法将函数作为参数传递
- 是否有可能有一个指针指向由奇怪的递归模板创建的基类
- 系统存储中的证书上下文总是有一个无效的pbCertEncoded指针
- C++如果我有一个对象指针,是在堆栈或堆上分配的方法变量
- 有一个可以是指针类型或非指针类型的模板参数
- 我有一个指向自定义项的未初始化指针表,我想检查是否已经存在某些内容
- C#:Cdecl-DllExport,参数中有一个指向类实例的指针