今後、たとえば10文字のポインターに最初にメモリを割り当て、次にこれらの文字ポインターのそれぞれにメモリを割り当てると、 p は10文字のポインターを読み取り専用にすることになっていますか、それとも文字列自体を読み取ることになっていますか? -それだけ?
ありがとうございます。
const char **p
へのポインタへのポインタを宣言しますconst char
。
cdecl> declare p as pointer to pointer to const char const char **p
したがって、文字の変更p[i][j]
は正しくありませんが、ポインタの変更p[i]
は正しいです。
C11 (n1570)、§ 6.3.2.1 左辺値、配列、および関数指示子
変更可能な左辺値は、配列型を持たず、不完全な型を持たず、const 修飾された型を持たず、構造体または共用体である場合、メンバー (再帰的にメンバーを含む) を持たない左辺値です。または、含まれるすべての集合体または共用体の要素) を const 修飾型で指定します。
=
また、 orなどの演算子を使用する++
には、オペランドが変更可能な左辺値である必要があります。
さらに、次のようなコード:
char **q = (char **)p;
q[i][j] = c;
未定義の動作につながります:
C11 (n1570)、§ 6.7.3 型修飾子
const 修飾されていない型の左辺値を使用して、const 修飾された型で定義されたオブジェクトを変更しようとした場合、動作は未定義です。
はconst
にバインドされているchar
ため、文字を変更できない文字列へのポインターが 10 個あることを意味します (とにかく、これらのポインターを介して!)。
この場合、p は const char へのポインターへのポインターです。多分それを書くより簡単な方法でしょう
char const **p
(このコードはあなたが書いたものと同等です)。右から左に読むと、p が何を表しているかがわかります。
この場合、指している char は *p を使用して変更できません。ただし、p または *p が指すものは変更できます。