int * const const * b
"int * const * b"とは何を意味していますか?
この意味は? cdeclはdeclare b as pointer to const const pointer to int
と言っています。 誰か説明できますか?
int * const const * b
"int * const * b"とは何を意味していますか?
この意味は? cdeclはdeclare b as pointer to const const pointer to int
と言っています。 誰か説明できますか?
const const
が冗長である、それはconst
に削減されます。
それでは、これを書き換えてみましょう:
int * const *b;
のでb
がintへのconstポインタへのポインタです。例では:また
int main(int argc, char **argv) {
int i = 5;
int *ip = &i;
int * const const * b = &ip;
(**b)++; /* legal */
(*b)++; /* illegal */
(b)++; /* legal */
return 0;
}
that questionを参照してください、これは有効なC99ですが、C++でも有効なC89有効ではありません。
これは単なる整数へのconstポインタへのポインタです。 Constは左に何もない限り、左にあるものに適用されます。右に適用されます。
ここでは、ちょうどあなたがそれがconstので、変異させないであろうことを本当に確信しているように繰り返される冗長 redundancy、持っています。ここでは、冗長なredundancyがあります。このことは、それがconstであり、変異しないことが本当に確実であるように繰り返されます。
でもcdecl.orgは、b is pointer to const const pointer to int
となります。 int
へconst
ポインタへのポインタである
int * const * b;
:
それは同じです。
const const
は、C99/C11に合法であるとconst
と同じです:
(C99、6.7.3p4)「同じ修飾子はどちらか、一度同じ指定子修飾子リスト内に複数表示された場合直接または1つ以上のtypedefを介して、動作は1回だけ出現した場合と同じです。
しかし、これはC89での制約違反です:
(C90、6.5.3)は「同じタイプ修飾子は、直接、同じ指定子リストまたは修飾子リストに複数回表示されてはなりませんまたは1つ以上のtypedefsを介して。
これは、基本的int **
またはINTへのポインタまたはint *
がint[]
int *
手段の後に配置const
を参照する方法であるint配列(へのポインタへのポインタでありますconst int *
とは逆のポインタ(内容はありますが)は変更できません。
第2のconst
は無視されています。
紛らわしい宣言の一般的な解決策:それを後方に読んでください。この場合、冗長const
を削除する必要があります。
ので、この:
int * const * b;
は次のようになります。英語で
b // b is a
* // pointer to
const // a constant
* // pointer to
int // an int
、それゆえ:intへの定数ポインタへのポインタ。
他にも言及したように、これはint **
のバージョンです。