我正在尝试学习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;
}
答案 0 :(得分:4)
double * const
(读作“常量指针”)表示指针是常量。您无法修改它,但可以更改它指向的对象。
const double *
或double const *
(读作“常量指针”)表示指针不能用于更改它指向的对象;但指针本身可以修改。
通常情况下,const
会在之前立即限定;或者第一件事,如果之前什么也没有。
答案 1 :(得分:1)
const double *ctd
:
ctd = nullptr;
)指向const double ...,指向的double将永远不会更改其值。 double *const ptd
:
答案 2 :(得分:1)
首先,关于double * const ptr
和const double * ptr
之间的区别。
第一个(double * const ptr
)生成一个常量指针ptr
,该指针应指向double
。指针本身是const,它指向的是 not const。
第二个变体(const double * ptr
)生成一个指向const double
的指针。在这种情况下,它是相反的:指针本身不是const,但指向的是 const。
现在,考虑到你得到的错误(我将从上到下):
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
的指针,该指针指向一个双精度指针。 答案 3 :(得分:0)
const double * x
与double const * x
相同。
x
指向不可变的double
” double
x
值
double * const y
y
是指向double
”的不可变指针 double
y
值
y
本身(即无法指向另一个内存位置)const double * const z
(或double const * const z
)
z
是指向不可变double
”的不可变指针 z
本身z
更改价值。在所有情况下,const
都会限定它之前的东西。
答案 4 :(得分:0)
请注意,部分问题可能是const
语法中的歧义。规则是 const适用于其左边的任何内容(除非没有任何内容,否则它适用于它的直接权利)
因此const T
与T const
相同,但T const *
与T * const
不同。
当你在一个类型中有多个const
时,这会变得更糟。
因此,我通常会将const
置于其适用类型的右侧,以保持一致。
由于大多数人会看到像const int
这样的示例作为使用constness的第一个示例,因此很可能会在以后放置const