0

今後、たとえば10文字のポインターに最初にメモリを割り当て、次にこれらの文字ポインターのそれぞれにメモリを割り当てると、 p は10文字のポインターを読み取り専用にすることになっていますか、それとも文字列自体を読み取ることになっていますか? -それだけ?

ありがとうございます。

4

3 に答える 3

2

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 修飾された型で定義されたオブジェクトを変更しようとした場合、動作は未定義です。

于 2013-04-10T12:22:39.793 に答える
0

constにバインドされているcharため、文字を変更できない文字列へのポインターが 10 個あることを意味します (とにかく、これらのポインターを介して!)。

于 2013-04-10T12:22:41.850 に答える
0

この場合、p は const char へのポインターへのポインターです。多分それを書くより簡単な方法でしょう

 char const **p

(このコードはあなたが書いたものと同等です)。右から左に読むと、p が何を表しているかがわかります。

この場合、指している char は *p を使用して変更できません。ただし、p または *p が指すものは変更できます。

于 2013-04-10T12:23:56.193 に答える