繁体   English   中英

在 C++ 中使用引用和指针

[英]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 ptrconst double * ptr的区别。 第一个( double * const ptr )生成一个常量指针ptr ,它应该指向double 指针本身是const,它指向的不是const。

第二个变体( 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 = π - 与第二个相同。 这里的指针是 const,但它必须指向一个普通的double 相反,您确实将其指向const double ,这会导致错误。 const double *const ptp = π 将工作。
  • double * const * pptr1 = &ptc; 在这里,您试图创建一个指针pptr1 ,它应该指向一个指向 double 的指针。
  • 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 适用于其直接左侧的任何内容(除非那里没有任何东西,在这种情况下,它适用于其直接右侧的任何内容)

所以const TT const相同,但T const *T * const

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

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

因为大多数人会看到像const int这样的例子作为使用const int的第一个例子,所以他们可能会在以后把const放在哪里时感到困惑

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM