我几周前使用数组编写了这个程序,现在我需要使用指针而不是使用数组。我不确定如何去做,所以任何提示都将不胜感激!谢谢! :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);
}
}
答案 0 :(得分:5)
我认为你的意思是“使用动态内存分配”......
许多人动态制作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]
是一个连续的块。所以你应该这样做:
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);
我经常更进一步,做一次内存分配而不是两次。那样我只有一个指针。但我不会在这里这样做。你必须有点意识到对齐,代码有点混乱。这是一种通常你不需要的优化。
希望有所帮助。
答案 1 :(得分:2)
更具体地说,您需要使用指针表示法而不是数组notaiton
这可能意味着你的二维数组应该被分配为一个指针数组。此外,应使用指针访问各个元素,而不是通常的数组索引。
例如
int * a = malloc(10 * sizeof(int)); // allocate memory for 10 integers
*a = 1; // assign first element of array
*(a+1) = 2; // assign second
以上是1D阵列。像在原始程序中一样将其扩展到多个维度。
答案 2 :(得分: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