[英]playing with references and pointers in C++
我正在尝试学习 C++,但在学习指针和引用时遇到了一些困难。 我试图理解为什么下面的一些不起作用,我似乎无法弄清楚“double *const ptd”和“const double *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;
)指向一个const double ...,指向的 double 永远不会改变它的值。 double *const ptd
:
首先,关于double * const ptr
和const double * ptr
的区别。 第一个( double * const ptr
)生成一个常量指针ptr
,它应该指向double
。 指针本身是const,它指向的不是const。
第二个变体( 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 = π
- 与第二个相同。 这里的指针是 const,但它必须指向一个普通的double
。 相反,您确实将其指向const double
,这会导致错误。 const double *const ptp = π
将工作。double * const * pptr1 = &ptc;
在这里,您试图创建一个指针pptr1
,它应该指向一个指向 double 的指针。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 适用于其直接左侧的任何内容(除非那里没有任何东西,在这种情况下,它适用于其直接右侧的任何内容)
所以const T
与T const
相同,但T const *
与T * const
。
当您在一个类型中有多个const
时,这在理解上会变得更糟。
因此,我通常总是将const
放在它适用的类型的右侧,以保持一致。
因为大多数人会看到像const int
这样的例子作为使用const int
的第一个例子,所以他们可能会在以后把const
放在哪里时感到困惑
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.