簡體   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