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

我认为你的意思是“使用动态内存分配”......

很多人动态做二维数组的方式是这样的:

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]是一个连续的块。所以你应该这样做:

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);

我经常更进一步,做一个内存分配而不是两个。这样我只有一个指针。但我不会在这里这样做。你必须有点注意对齐,代码有点混乱。这是您通常不需要的优化。

希望有帮助。

于 2012-10-15T03:37:52.253 回答
2

更具体地说,您需要使用指针表示法而不是数组表示法

这可能意味着您的二维数组应分配为指针数组。此外,应该使用指针而不是通常的数组索引来访问它的各个元素。

例如

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

以上是一维数组。将其扩展到原始程序中的多个维度。

于 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 回答