在C++中玩引用和指针

playing with references and pointers in C++

本文关键字:指针 引用 C++      更新时间:2023-10-16

我正在尝试学习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 ptrconst double * ptr之间的区别。 第一个(double * const ptr)做一个常量指针ptr它应该指向double。指针本身是常量,它指向的不是恒量

第二个变体(const double * ptr)是一个指针,应该指向一个const double。在这种情况下,情况正好相反:指针本身不是常量,但它指向的是常量。

现在,考虑到您遇到的错误(我将从上到下):

  • const double r;- 您需要初始化常量,如下所示:const double r = 15;
  • double *ptr = π- 你基本上是在做一个指向r的指针。由于rconst的,指针必须是指向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 * xdouble 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 TT const一样,但T const *T * const不一样。

当您在一个类型中有多个const时,理解起来会变得更糟。

因此,我通常总是将const放在它所适用的类型的右侧,以保持一致。

由于大多数人会将像const int这样的示例视为使用恒常性的第一个示例,因此以后可能会让他们对将const放在哪里感到困惑