在C++中玩引用和指针
playing with references and pointers in C++
我正在尝试学习C++,但在学习指针和参考时遇到了一些困难。我试图理解为什么下面的一些不起作用,我似乎无法弄清楚"双*常量ptd"和"常量双*ctd"之间的区别
double d;
const double r; //bad; r must be initialised
const double pi = 3.1416;
double *ptr = π //illegal to point to a constant, because otherwise one could change the value of the constant which defies the purpose of a constant
double *const cpt; //bad; cpt must be initialised
double *const ptd = &d;
const double *ctd = &d;
const double *ptc = π
double *const ptp = π //illegal
const double *const ppi = π
double * const * pptr1 = &ptc;
double * const * pptr2 = &ptd;
void F () {
ptr = new double;
r = 1.0;
*ptr = 2.0;
cpt = new double;
*cpt = 3.0;
ptc = new double;
*ptc = 4.0;
ptd = new double;
*ptd = 5.0;
ctd = new double;
*ctd = 6.0;
ptp = new double;
*ptp = 7.0;
ppi = new double;
*ppi = 8.0;
}
double * const
(读作"常量指针")表示指针是常量。您无法修改它,但可以更改它指向的对象。
const double *
或double const *
(读作"指向常量的指针")意味着指针不能用于更改它指向的对象;但指针本身可以修改。
一般来说,const
限定了它前面的东西;或者第一件事,如果它之前没有任何东西。
const double *ctd
:
- 它表示一个指针(一个地址,很像指示内存区域开始的整数值),它不是恒定的(这个地址值可以改变,以便指向另一个内存区域,例如
ctd = nullptr;
)指向一个常量双精度...,指向的双精度永远不会改变它的值。
double *const ptd
:
- 指针(一个地址,很像指示内存区域开始的常量整数值)(此地址值不能更改以指向其他任何内容)指向值可以更改的双精度值。
首先,关于double * const ptr
和const double * ptr
之间的区别。 第一个(double * const ptr
)做一个常量指针ptr
它应该指向double
。指针本身是常量,它指向的不是恒量。
第二个变体(const double * ptr
)是一个指针,应该指向一个const double
。在这种情况下,情况正好相反:指针本身不是常量,但它指向的是常量。
现在,考虑到您遇到的错误(我将从上到下):
const double r;
- 您需要初始化常量,如下所示:const double r = 15
;double *ptr = π
- 你基本上是在做一个指向r
的指针。由于r
是const
的,指针必须是指向const double
的指针,而不仅仅是double
。 正确的将是const double *ptr = π
double *const cpt;
- 再次未初始化常量,与第一个相同。必须初始化所有常量。像double *const cpt = new double
这样的事情就可以了。double *const ptp = π
- 与第二个相同。您在这里的指针是常量,但它必须指向一个正常的double
。相反,您正在调整以使其指向const double
,这会导致错误。const double *const ptp = π
会起作用。double * const * pptr1 = &ptc;
在这里,您正在尝试创建一个指针pptr1
该指针应指向指向双精度的指针。
const double * x
与double const * x
相同。- 它的意思是"
x
指向一个不可变的double
"> - 也就是说,
double
值无法通过x
- 它的意思是"
double * const y
- 表示"
y
是指向double
的不可变指针"> - 您可以通过
y
更改double
值 - 但是您无法更改指针本身
y
(即不能指向另一个内存位置)
- 表示"
- 还有
const double * const z
(或double const * const z
)- 表示"
z
是一个指向不可变double
的不可变指针"> - 您无法更改指针本身
z
- 您也不能通过
z
更改值。
- 表示"
在所有情况下,const
限定了它前面的东西。
请注意,部分问题可能是const
语法中的歧义。该规则适用于其紧邻左侧的任何东西(除非那里没有任何东西,在这种情况下,它适用于其直接权利的任何内容)
所以const T
和T const
一样,但T const *
和T * const
不一样。
当您在一个类型中有多个const
时,理解起来会变得更糟。
因此,我通常总是将const
放在它所适用的类型的右侧,以保持一致。
由于大多数人会将像const int
这样的示例视为使用恒常性的第一个示例,因此以后可能会让他们对将const
放在哪里感到困惑
- 如何使用基类指针引用派生类成员
- 将常量指针引用绑定到非常量指针
- 如果非动态变量被指针引用,何时超出范围?
- 转换指针引用的字符串
- 指针引用的生存期(以 C++为单位)
- 从 unique_ptr::get 发送指针作为指针引用进入函数
- 指针/引用的 CLion 格式
- 使用模板专用化来比较指针引用
- 如何保存指向抽象基类的指针/引用,但在 c++ 中仍然可以复制
- C++初始化指针/引用/复制细微差别
- 用数组或指针引用函数?
- 指针范围问题和返回类中封装的指针向量内的指针引用
- 强制转换为指针引用是否会导致未定义的行为
- 访问由 void 指针引用的结构的成员
- C 为什么当先前的步骤引发异常时,std :: shared_ptr的指针引用会被破坏
- 动态指针引用数组由三元运算符返回值,但有异常
- 悬空指向 int 和 char* 常量的指针/引用
- C++ 二维数组和指针引用
- 通过使用指针/引用,在C++中使用向量加快计算速度
- C++非类型模板模板到函数指针/引用