[英]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 ptr
和const double * ptr
的區別。 第一個( double * const ptr
)生成一個常量指針ptr
,它應該指向double
。 指針本身是const,它指向的不是const。
第二個變體( const double * ptr
)創建一個應該指向const double
的指針。 在這種情況下,情況正好相反:指針本身不是常量,但它指向的是常量。
現在,考慮到您遇到的錯誤(我將從上到下):
const double r;
- 你需要初始化常量,像這樣: const double r = 15
;double *ptr = π
- 您基本上是在指向r
。 由於r
是const
,指針必須是指向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 * x
與double 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 T
與T const
相同,但T const *
與T * const
。
當您在一個類型中有多個const
時,這在理解上會變得更糟。
因此,我通常總是將const
放在它適用的類型的右側,以保持一致。
因為大多數人會看到像const int
這樣的例子作為使用const int
的第一個例子,所以他們可能會在以后把const
放在哪里時感到困惑
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.