恒定指向恒定类型
Constant Pointer to Constant Type
我才刚刚开始了解C ,如果这很明显,请原谅我。以下指针有什么区别?
const int i = 42;
constexpr const int *p = &i;
const int const* p2 = &i;
对我来说,似乎它们都是恒定的int指针。有区别吗?我什么时候可以使用每种类型的声明?
谢谢:)
1)Meaning of constexpr int *p = &i;
p is const: it cannot be reassigned
i can be modified through p
2)Meaning of const int *p2 = &i;
p2 is non-const: it can be reassigned to point to a different int
i cannot be modified through p2 without use of a cast
此代码无效C ,在大多数情况下甚至都不会编译。您可能对本文感兴趣:const int *,const int *const和int const *?
之间有什么区别所有三个声明
const int const* p2 = &i;
const int * p2 = &i;
int const* p2 = &i;
只是编写同一件事的不同方法:(const int)(非const指针)。大多数编译器在代码通过中的声明时都会吹来,因为它不是标准的C ,也可能是错误的错误。
您将能够写
p2 = p3; // assign value of (pointer p3) to (pointer p2)
因为(指针)不是const,但不是
*p2 = *p3; // assign (object) pointed by (pointer p3) to (object) pointed by (pointer p2)
因为(对象)指针指向的是const(在这种情况下为const int)
,但是如果您会写
int * const p2 = &i;
那么,它将是指向(int)对象的(const指针)。那么事情将完全相反:
p2 = p3; // don't work
*p2 = *p3; // work!
您还可以编写const int * const以禁止这两个选项或不使用const允许两者。
constexpr是一个非常不同的关键字。它不是说这只是一个(const对象),而是说它是(const对象,具有编译时已知的值)。C 中的大多数" const对象"在数学意义上不是'常数',因为它们在同一程序的不同运行中可能有所不同。它们是在运行时创建的,我们只是告诉编译器,我们以后不会更改它们。另一方面," constexpr"意味着它是一劳永逸的"真实"常数。它总是相同的,因此在编译的二进制代码中进行了硬编码。由于您是初学者,因此将其视为#Define的花哨的C 版本。在您的情况下,您尝试将指针声明为const int为constexpr,但是不会发生这种情况,因为该指针在程序的不同运行中会有所不同,并且无法在编译时确定。
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 运行时错误:引用绑定到类型为"int"的空指针
- 无法将运行时类绑定到 XAML T 必须是 WinRT 类型
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 无法将类型"T&"的非常量左值引用绑定到类型"T"的右值 t++ std::atomic<T>
- 结构化绑定初始值设定项表单 { 赋值表达式 } 对于 clang 上的数组类型失败
- 在其他容器中使用 boost::container::static_vector 时,GCC 编译错误"将'const s'绑定到类型's&'的引用丢弃限定符"
- 为什么定义复制构造函数会给我错误:无法将类型 'obj&' 的非常量左值引用绑定到类型为"obj"的右值?
- 指内置类型的文字
- 错误:对类型 'const ItemInstance' 的引用无法绑定到类型 'void' 的右值
- 没有类型结构绑定不起作用?
- 为什么"const auto [x, y]"绑定到引用类型时没有按预期运行?
- std::绑定variadic模板和自动返回类型
- 如何对绑定的成员方法进行typedef,然后将该类型用作模板参数
- 在无序映射的结构化绑定中推导类型
- 错误:在类型 "blah blah" 的绑定引用中删除限定符以初始化"some other blah blah"
- 您自己的类型的结构化绑定,不是结构或元组(通过公共成员函数)
- 使用 pybind11 绑定 typedef 类型的正确语法是什么?
- C++ 如何将参数绑定到具有相同返回类型的函数,并将它们全部存储在一个容器中
- 如何使用非尾随 decltype 返回类型定义行外类模板成员函数