2

私の質問は、なぜ彼らは配列へのポインタとしてポインタint**の宣言で()を使用したのかということです。matrix必要ですか?どんな違いがあるの?

#include <iostream>
using namespace std;
int main()
{
    int **matrix;       // Pointer to matrix
    matrix = (int **) new int *[2]; // Why use (int**) is it necessary?
    for (i = 0; i < 2; i++)
        matrix[i] = new int[2];
    for (i = 0; i < 2; i++)
        for (int j = 0; j < 2; j++) {
            matrix[i][j] = j + i;
        }
}
4

3 に答える 3

4

それは不必要であり、潜在的に危険です。

new-expressionのタイプはすでにint**、に割り当てるのに適していmatrixます。独自のタイプに変換する必要はありません。

変換が必要な場合でも、Cスタイルのキャストを使用しないでください。そうすることで、意味がない場合でも変換が強制されます。これは、エラーを隠すための非常に良い方法です。たとえば、new誤ってタイプを間違えた場合:

matrix = new int[2];           // Friendly compiler error
matrix = (int**) new int[2];   // No diagnostic, likely to cause weird
                               // run-time errors.
于 2012-12-10T07:46:35.130 に答える
2

考えられる理由:彼らはCプログラマーです

本Cでは、mallocから動的メモリ割り当てをキャストするのが通例です。

matrix = (int**) malloc(2*sizeof(int*));// C
matrix = (int**) new int*[2]; // local argot
于 2012-12-10T07:51:24.350 に答える
0

行列のタイプはですint**。この場合、*は単なるポインタではなく、配列へのポインタです。つまり**、配列へのポインタの配列へのポインタを意味します。これが、行列の2次元を取得する方法です。

于 2012-12-10T07:43:49.197 に答える