2017-09-10 7 views
1

数日前にC++ Primerの本を購入しました。私はこの新しい言語を学び始めました。C++を学ぶ:これはなぜ違法ですか?

瞬間、私は自分自身を書いたこのブロックが違法である理由undestandしようとしている:

私は512へのconst int型を初期化します。 const int constポインタをnに初期化します。 しかし、それは私がしても正しくダブルを使用して、ポインタへのconst int型のconstポインタを作成することはできません**、すべて:

const signed int n = 512; 
const signed int *const nPointer = & n; 
const signed int **const nPointer2 = & nPointer; 

誰かが簡単な説明を持っていますか?御時間ありがとうございます!

+0

あなたはどのようなエラーが出るのですか? –

+6

最後の行では、1つの 'const'が間違った場所にあります。' const signed int * const * nPointer2 =&nPointer; '' nPointer2'が 'const'であるかどうかは関係ありません。重要なことは、それが指しているのは 'const'だということです。 –

+0

ありがとう、今私はundestand! – MrMaxcrime

答えて

0

最初に問題を単純化し、署名付きメッセージを削除してください。問題は同じままです 第2に、コンパイラを使用し、エラーメッセージを読んでください。これは、だけでなく、C++ 問題はここにある、すべての言語に対して有効です:constがint型* constの

あなたの命令はあなたが次のことを

const signed int **const nPointer2 = & nPointer; 

を取得しているが署名されている

const int **const nPointer2 = & nPointer; 

nPointerタイプメッセージ:

error: invalid conversion from 'const int* const*' to 'const int**'

ご覧のとおり、constは2つのstaの間にありますrs。コンパイルエラーを作成します。

&は、の末尾にを置きます。

コードを修正するために
1

2つのオプションがあります。

//Option one : 
const signed int *const nPointer = & n; 
const signed int *const *const nPointer2 = & nPointer; 
//Option two : 
const signed int * nPointer = & n; 
const signed int **const nPointer2 = & nPointer; 

説明:nPointerはTへの定数ポインタがあるとき

は、nPointer2はのように、Tへの定数ポインタを指している必要があります最初のオプション。あるいは、nPointer2がTへの非constポインタへのポインタである場合、pointee nPointerも非constである必要があります。

あなたがあなた自身の型の別名を定義する書籍の一部を取得するとき、あなたは次のようにこれらの選択肢がどのように機能するかを確認するために混乱を削除することができます。

//simplifying notation: 
using myType = const signed int *; 
using myTypeC = const signed int * const; 

//your code equivalent to: 
myTypeC nPointer = & n; 
myType *const nPointer2 = & nPointer; 

//Option One:  
myTypeC nPointer = & n; 
myTypeC *const nPointer2 = & nPointer; 
//Option Two:  
myType nPointer = & n; 
myType *const nPointer2 = & nPointer; 
関連する問題