0

数週間前に配列を使用してこのプログラムを作成しましたが、現在は配列を使用する代わりにポインターを使用する必要があります。どうすればいいのかわからないので、アドバイスをいただければ幸いです!ありがとう!:D

コードは次のとおりです。

#include <stdio.h>

int showArray(int row);
int exchangeRow(int row1, int row2);

int x, y;
int array[10][10];
int j;
int k;
int inputrow;
int inputcolumn;
int scanrow;
int temp;
int row1;
int row2;

int main() {

    // Initialize array
    for(j = 0; j < 10; j++) {
          printf("\n");
          for(k = 0; k < 10; k++) {
                array[j][k] = j * 10 + k;
                printf("%d ", array[j][k]);
          }
    }
    printf("\n \n");

    // Print out selected row
    printf("Type in a number for the corresponding row to be printed \n");
    scanf("%d", &inputrow);
    if(inputrow >= 0 && inputrow < 10) {
             for(j = 0; j < 10; j++) {
                   printf("%d ", array[inputrow][j]);
             }
    }
    printf("\n \n");

    //Print out selected column
    printf("Type in a number for the corresponding column to be printed \n");
    scanf("%d", &inputcolumn);
    if(inputcolumn >= 0 && inputcolumn < 10) {
             for(j = 0; j < 10; j++) {
                   printf("%d ", array[j][inputcolumn]);
             }
    }
    printf("\n \n");

    printf("Type in a number for the row that method showArray will print \n");
    scanf("%d", &scanrow);
    showArray(scanrow);
    printf("\n \n");

    printf("Type in two numbers for the rows that method exchangeRow will switch \n");
    scanf("%d %d", &row1, &row2);
    exchangeRow(row1, row2);
    printf("\n \n");

    system("PAUSE");
}

int showArray(int row) {
    for(j = 0; j < 10; j++) {
           printf("%d ", array[row][j]);
     }
}

int exchangeRow(int row1, int row2) {
    if(row1 >= 0 && row1 < 10 && row2 >= 0 && row2 < 10) {
           temp = row1;
           row1 = row2;
           row2 = temp;
           printf("The first row now holds the values: ");
           showArray(row1);
           printf("\n");
           printf("The second row now holds the values: ");
           showArray(row2);
    }
}
4

3 に答える 3

6

「動的メモリ割り当てを使用する」という意味だと思います...

多くの人が 2D 配列を動的に行う方法は次のとおりです。

const size_t nrows = 10, ncols = 10;

int **array = malloc( nrows * sizeof(int*) );
for( i = 0; i < nrows; i++ ) {
    array[i] = malloc( ncols * sizeof(int) );
}

しかし、私はこれが嫌いです。プロダクション コードを実行している場合、これは非常に遅くなる可能性があります。また、メモリが不足した場合の処理​​が難しくなり、配列の局所性が保証されません。さらに、解放するのは醜いです:

for( i = 0; i < nrows; i++ ) free(array[i]);
free(array);

メモリ内では、スタティックarray[10][10]は 1 つの連続したブロックです。したがって、同じことを行う必要があります。

int **array = malloc( nrows * sizeof(int*) );
array[0] = malloc( nrows * ncols * sizeof(int) );
for( i = 1; i < nrows; i++ ) {
    array[i] = array[i-1] + ncols;
}

それを解放するには:

free(array[0]);
free(array);

私はしばしばこれをさらに一歩進めて、2 つではなく 1 つのメモリ割り当てを行います。そうすれば、ポインタは1つだけになります。でもここではしません。位置合わせを少し意識する必要があり、コードは少し面倒です。通常は必要のない最適化です。

それが役立つことを願っています。

于 2012-10-15T03:37:52.253 に答える
2

より具体的には、配列表記ではなくポインター表記を使用する必要があります

これはおそらく、2 次元配列をポインターの配列として割り当てる必要があることを意味します。また、個々の要素には、通常の配列インデックスではなくポインターを使用してアクセスする必要があります。

例えば

int * a = malloc(10 * sizeof(int)); // allocate memory for 10 integers
*a = 1;        // assign first element of array
*(a+1) = 2;    // assign second

上記は1D配列用でした。元のプログラムのように多次元に拡張します。

于 2012-10-15T03:43:59.227 に答える
0

などの配列を宣言するとint arr[4];arr実際には、それぞれが整数を保持する 4 つの「スペース」を持つメモリ内の場所を「ポイント」します。

&arrは「~の住所」を意味しますarr

したがって、arr へのポインターは次のように定義できます。

int *ptr = &arr[0];

しかし、どのようにポイントするデータを取得しますか? ptr答えは次のとおりです。

*ptr;

ただし、これは、占有する最初の「スペース」に格納されたデータの最初の値のみを表示しますarr。配列内の他のものを取得するには、次のように、メモリ内のスペースに沿ってポインターをインクリメントするだけです。

ptr++;

詳細については、http: //alumni.cs.ucr.edu/~pdiloren/C++_Pointers/neighbor.htmを参照してください。

于 2012-10-15T03:36:24.810 に答える