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 *またはdouble const *(「定数へのポインター」と読みます)は、ポインターを使用して、ポインターが指すオブジェクトを変更できないことを意味します。ただし、ポインタ自体は変更できます。

一般に、const資格はその直前のものを修飾ます。または最初に、その前に何もない場合。

于 2012-11-23T11:50:51.083 に答える
1

const double *ctd

  • これは、定数ではないポインタ(メモリゾーンの開始を示す整数値によく似たアドレス)を意味します(このアドレス値は、たとえば、メモリの別のゾーンを指すように変更できます)。constdoubleを指します。 。、ポイントされたdoubleはその値を変更しません。ctd = nullptr;

double *const ptd

  • これは、定数(このアドレス値は他のものを指すように変更できない )であるconstポインター(メモリゾーンの開始を示すconst整数値によく似たアドレス)を意味し、値が変更される可能性のあるdoubleを指します。
于 2012-11-23T11:49:31.970 に答える
1

まず、との違いdouble * const ptrについてconst double * ptr。最初のもの(double * const ptr)は、を指す定数ポインタptrを作成しdoubleます。ポインタ自体はconstであり、それが指すものはconstではありません

2番目のバリアント(const double * ptr)は、を指すポインターを作成しますconst double。この場合は逆です。ポインタ自体はconstではありませんが、ポインタが指すのconstです。

ここで、発生しているエラーを考慮します(上から下に移動します)。

  • const double r;-次のように定数を初期化する必要があります:const double r = 15;
  • double *ptr = π-基本的にはへのポインタを作成していますrrはであるため、ポインタは。だけでなく、constへのポインタである必要があります。正しいものはconst doubledoubleconst double *ptr = π
  • double *const cpt;-最初の定数と同じ、初期化されていない定数。すべての定数を初期化する必要があります。のようなものdouble *const cpt = new doubleが行います。
  • double *const ptp = π--2番目のものと同じです。ここでのポインタはconstですが、通常のを指している必要がありますdoubleconst double代わりに、エラーにつながる、を指すようにしようとしています。const double *const ptp = π動作します。
  • double * const * pptr1 = &ptc;pptr1ここでは、doubleへのポインターを指すポインターを作成しようとしています。
于 2012-11-23T11:50:47.793 に答える
0
  • const double * xと同じdouble const * xです。
    • それは「不変であるをx指す」ことを意味しますdouble
    • つまり、double値を次の方法で変更することはできません。x
  • double * const y
    • " は"への不変ポインタであることを意味しますydouble
    • double経由で値を変更できますy
    • ただし、ポインターy自体を変更することはできません (つまり、別のメモリ位置を指すことはできません)。
  • もありますconst double * const z(またはdouble const * const z
    • は不変への不変ポインタを意味しますzdouble
    • zポインタ自体を変更することはできません
    • を介して値を変更することもできませんz

いずれの場合も、constその直前のものを修飾します。

于 2012-11-23T11:51:51.107 に答える
0

const問題の一部は、構文のあいまいさにある可能性があることに注意してください。ルールはconst であり、すぐ左にあるものに適用されます (何もない場合を除き、すぐ右にあるものに適用されます)

Soconst Tは と同じですが、 とはT const異なりT const *ますT * const

constこれは、1 つの型に複数あると理解が難しくなります。

したがって、一貫性を保つために、通常は常に、constそれが適用される型の右側に配置します。

ほとんどの人はconst int、constness を使用する最初の例のような例を目にするので、おそらく後になって、const

于 2012-11-23T12:23:40.857 に答える