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

时间:2012-11-23 11:42:45

标签: c++ pointers reference

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

5 个答案:

答案 0 :(得分:4)

double * const(读作“常量指针”)表示指针是常量。您无法修改它,但可以更改它指向的对象。

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

通常情况下,const会在之前立即限定;或者第一件事,如果之前什么也没有。

答案 1 :(得分:1)

const double *ctd

  • 表示指针(一个非常类似于指示内存区域开头的整数值的地址)不是常数(此地址值可以更改为指向另一个内存区域,例如ctd = nullptr;指向const double ...,指向的double将永远不会更改其值。

double *const ptd

  • 它表示常量指针(一个非常类似于指示内存区域开头的const整数值的地址)常量(此地址值不能更改为指向其他任何内容)指向双重哪个值可以更改。

答案 2 :(得分:1)

首先,关于double * const ptrconst 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的指针。由于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的指针,该指针指向一个双精度指针。

答案 3 :(得分:0)

  • const double * xdouble 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 TT const相同,但T const *T * const不同。

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

因此,我通常会将const置于其适用类型的右侧,以保持一致。

由于大多数人会看到像const int这样的示例作为使用constness的第一个示例,因此很可能会在以后放置const