web-dev-qa-db-ja.com

const char *とchar const *-それらは同じですか?

私の理解では、const修飾子は右から左に読む必要があります。それから、私はそれを得る:

const char*

char要素を変更できないポインターですが、ポインター自体は変更できます。

char const*

mutable charsへの定数ポインターです。

しかし、次のコードでは次のエラーが発生します。

const char* x = new char[20];
x = new char[30];   //this works, as expected
x[0] = 'a';         //gives an error as expected

char const* y = new char[20];
y = new char[20];   //this works, although the pointer should be const (right?)
y[0] = 'a';         //this doesn't although I expect it to work

だから...どれですか?私の理解またはコンパイラ(VS 2005)は間違っていますか?

79
Luchian Grigore

実際、標準に従って、constは要素を直接その左に変更します。宣言の先頭でのconstの使用は、便利な精神的なショートカットにすぎません。したがって、次の2つのステートメントは同等です。

char const * pointerToConstantContent1;
const char * pointerToConstantContent2;

ポインター自体が変更されないようにするには、constをアスタリスクの後に配置する必要があります。

char * const constantPointerToMutableContent;

ポインターとポインターが指すコンテンツの両方を保護するには、2つのconstを使用します。

char const * const constantPointerToConstantContent;

私は個人的にalwaysを採用しました。変更しない部分の後にconstを置いて、ポインタが一定に保ちたい部分であっても一貫性を維持します。

127
Greyson

両方が同じであるため機能します。混乱するかもしれませんが、

const char*  // both are same
char const*

そして

char* const  // unmutable pointer to "char"

そして

const char* const  // unmutable pointer to "const char"

[これを覚えておくために、ここに簡単なルールがあります。'*'は最初にLHS全体に影響します]

30
iammilind

これは、ルールが次のとおりであるためです。

ルール:constは左にバインドします。左に何もなければ、右にバインドします:)

だから、これらを見てください:

(const --->> char)*
(char <<--- const)*

両方同じ!ああ、そして--->>および<<---は演算子ではなく、constのバインド先を示すだけです。

24
Akanksh

2つの単純な変数初期化の質問 )から

constに関する非常に良い経験則:

右から左への宣言を読む

(Vandevoorde/Josutissの「C++テンプレート:完全ガイド」を参照)

例えば。:

int const x; // x is a constant int
const int x; // x is an int which is const

// easy. the rule becomes really useful in the following:
int const * const p; // p is const-pointer to const-int
int const &p;        // p is a reference to const-int
int * const * p;     // p is a pointer to const-pointer to int.

私はこの経験則に従って以来、このような宣言を誤解することはありませんでした。

(:sisab retcarahc-rep a no ton、sisab nekot-rep a no tfel-ot-thgir naem I hguohT:tidE

11
Sebastian Mach

ここに私がいつも解釈しようとする方法があります:

char *p

     |_____ start from the asterisk. The above declaration is read as: "content of `p` is a `char`".

char * const p

     |_____ again start from the asterisk. "content of constant (since we have the `const` 
            modifier in the front) `p` is a `char`".

char const *p

           |_____ again start from the asterisk. "content of `p` is a constant `char`".

それが役に立てば幸い!

5
yasouser

どちらの場合も、定数charを指しています。

const char * x  //(1) a variable pointer to a constant char
char const * x  //(2) a variable pointer to a constant char
char * const x  //(3) a constant pointer to a variable char
char const * const x //(4) a constant pointer to a constant char
char const * const * x //(5) a variable pointer to a constant pointer to a constant char
char const * const * const x //(6) can you guess this one?

デフォルトでは、constは、すぐ左にあるものに適用されますが、(1)のように、前に何もない場合はすぐ右にあるものに適用できます。

0
Lino Mediavilla