1

我正在尝试学习 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;
  }
4

5 回答 5

4

double * const(读作“常量指针”)表示指针是常量。你不能修改它,但你可以改变它指向的对象。

const double *or double const *(读作“指向常量的指针”)表示指针不能用于改变它指向的对象;但指针本身可以修改。

一般来说,const限定在它之前的事物;或者第一件事,如果它之前没有任何东西。

于 2012-11-23T11:50:51.083 回答
1

const double *ctd

  • 它意味着一个指针(一个地址很像一个指示内存区域开始的整数值),它不是常量(这个地址值可以改变以指向另一个内存区域,例如ctd = nullptr;指向一个 const double .. .,被指向的双精度值永远不会改变它的值。

double *const ptd

  • 它意味着一个常量指针(一个非常类似于指示内存区域开始的常量整数值的地址),它是一个常量(这个地址值不能改变以指向其他任何东西) 指向一个值可以改变的双精度值。
于 2012-11-23T11:49:31.970 回答
1

double * const ptr首先,关于和的区别const double * ptr。第一个 ( double * const ptr) 是一个常量指针ptr,它应该指向double. 指针本身是 const,它指向的不是const。

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

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

  • 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. 相反,您确实将其指向 a const double,这会导致错误。const double *const ptp = π将工作。
  • double * const * pptr1 = &ptc;在这里,您试图创建一个指针,该指针pptr1应该指向一个双精度指针。
于 2012-11-23T11:50:47.793 回答
0
  • const double * x是一样的double const * x
    • 它的意思是x指向一个double不可变的”
    • 也就是说,该double值不能通过x
  • double * const y
    • 表示"是指向"y的不可变指针double
    • 您可以通过更改doubley
    • 但你不能改变指针y本身(即不能指向另一个内存位置)
  • 还有const double * const z(或double const * const z
    • 表示z是指向不可变对象的不可变指针double
    • 你不能改变指针z本身
    • 您也不能通过z.

在所有情况下,const限定它之前的事物。

于 2012-11-23T11:51:51.107 回答
0

请注意,问题的一部分可能是const语法中的歧义。规则是const 适用于其最左边的任何东西(除非那里没有任何东西,在这种情况下它适用于它最右边的任何东西)

Soconst T与 相同T const,但T const *与 不同T * const

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

因此,为了保持一致,我通常会始终将其放在const适用的类型的右侧。

由于大多数人会看到像const int使用 constness 的第一个示例这样的示例,因此稍后可能会在将const

于 2012-11-23T12:23:40.857 回答