5

この2行だけでテストプログラムを試してみると

char array[256];
char** arrayPointer=&array;

エラーが発生します

char*[256]からchar**に変換できません。

しかし、私がこれを行う場合:

char array[256];
char* temp=array;
char** arrayPointer=&temp;

そのような苦情はありません。

私はそれが日食のバギー(私の日食は今面白い行動をしています)だと思いましたが、関数の&arraytoのキャストを実行しようとするchar**と、異常な動作になり、デバッガーは配列が変更されていないことを意味します必要に応じて。

PS。これはすべて手書きで書かれたもので、タイプミスは許してください。

4

1 に答える 1

15

C ++では、配列とポインターは同じものではありません。多くの場合、配列は暗黙的にポインターに変換できますが、配列タイプとポインタータイプは異なります。

あなたの場合、変数

char array[256];

タイプがありchar[256]ます。を記述してそのアドレスを取得すると、タイプが。である&array256の配列へのポインタを取得します。これは同じではありません。これは実際には良いことです。変換を実行できるとしたら、これを実行するとどうなりますか?charchar (*)[256]char**

char array[256];
char** ptrPtr = &array; // Not legal!
*ptrPtr = new char[256];

この場合、3行目はarray、256要素の新しい配列を指すように「再割り当て」します。ただし、arrayポインタではありません!この操作は無意味です。

書き込み時に奇妙なデバッガエラーが発生した理由

char array[256];
char** ptrPtr = (char**) &array; // Legal, but Bad Times!
*ptrPtr = new char[256];

あなたが入れたキャストは未定義の振る舞いをもたらすということです。256個の実際のcharオブジェクトの配列へのポインタが実際には。へのポインタであるかのように見せかけていますchar。これは無意味なキャストなので、あなたがそれをするとき、すべての賭けはオフになります。

一方、次のchar*ような変数を明示的に導入した場合:

char array[256];
char* ptr = array;
char** ptrPtr = &ptr;

その後、すべてが大丈夫です。char*2行目では、の最初の要素を指すポインタ(実際のタイプ)を作成しますarray。3行目では、その新しいポインターへのポインターを作成します。あなたがそれから書くなら

*ptrPtr = new char[137];

その後、悪いことは何も起こりません。指している場所を変更しただけでptr、破壊しませんでしarrayた。

お役に立てれば!

于 2012-06-21T21:04:34.637 に答える