在很长一段时间的缺席之后,我最近又回到了C语言中,我一辈子都记不起如何将一个2D矩阵传递给一个函数,并在错位之后使用它。我相信我已经正确地传递了指针,但我似乎无法实际访问矩阵中的任何东西,也不知道为什么。
这是我写的:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
void matrixOperation(int *arr, int m, int n)
{
printf("in matrixOperation\n ");
int i, j;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
printf("%d\n", *((arr+i*n) + j));
}
int main()
{
int i,j,count;
int row, col;
//------------------------------
printf("Number of rows?\n ");
scanf("%d", &row);
printf("Number of columns?\n ");
scanf("%d", &col);
//------------------------------
int* arr[row];
for (i = 0; i < row; i++)
arr[i] = (int*)malloc(col * sizeof(int));
count = 0;
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
arr[i][j] = ++count;
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
printf("%d\n",arr[i][j]);
// We can also use "print(&arr[0][0], m, n);"
matrixOperation((int *)arr, row, col);
for (int i = 0; i < row; i++)
free(arr[i]);
return 0;
}
我们的目标是让它接受用户输入的矩阵大小,用一个计数填充每个索引,然后将其传递给一个函数,该函数将其打印出来。然而,当我尝试使用它时,print语句只是输出随机数,我认为这些随机数就是指针所指向的。
我希望matrixOperation输出与main中的print语句相同的内容,但我不知道我做错了什么。
2条答案
按热度按时间ukqbszuj1#
更改函数签名,您应该能够使用相同的代码段。
致电:
记住,当一个数组被传递给一个函数时,它会“衰减”成一个指针。你有一个指针数组。它衰减成一个指向指针的指针。
2o7dmzc52#
你声明了一个指针数组
所以把这个数组传递给函数。
函数将声明为
并调用如下函数
尽管这样定义函数会更好
请注意,这个表达式带有指针运算
可以使用下标运算符按以下方式重写
这两个表达式彼此等价。
至于通过强制转换数组指示符调用函数
那么它是错误的,因为你没有一个内存范围。你分配了几个内存范围。