C语言函数未传递行数参数时,能否使用二维数组?相关疑问
问题解答
1. 必须显式传递行数N作为参数
是的,你必须把N传给函数。因为函数参数里的int (*myarray)[M]本质是一个指向长度为M的int数组的指针,它只知道自己指向的一维数组有多少元素(M个),但完全不知道原二维数组的总行数。没有N的话,函数没法确定遍历的终止条件,所以必须把N作为额外参数传入,修改后的函数原型应该是:
int function(int N, int (*myarray)[M], double y) {}
2. 为什么用sizeof获取行数失败
在main函数里,int myarray[N][M]是一个真正的二维数组实体,此时sizeof(myarray)返回整个二维数组的总字节数(N*M*sizeof(int)),用这个值除以sizeof(myarray[0])(一行的字节数,M*sizeof(int)),就能算出总行数N。
但到了函数内部,情况完全不同:虽然参数写的是int (*myarray)[M],但它已经不是数组了,而是一个指针。此时sizeof(myarray)返回的是指针本身的大小(比如64位系统是8字节),再除以sizeof(myarray[0])得到的结果和N毫无关系,自然没法正确获取行数。
3. 函数内的myarray和main中myarray的核心区别
- main里的
int myarray[N][M]:是二维数组对象,占用一块连续的内存空间,类型为int [N][M],编译器清楚它的完整维度(N行M列),所以能通过sizeof计算总行数、总大小。 - 函数内的
int (*myarray)[M]:是指向一维数组的指针,仅存储一个内存地址,类型为int (*)[M],它只知道自己指向的数组有M个元素,但完全丢失了原二维数组的行数信息。简单说就是,数组作为参数传递时会“退化”成指针,丢掉了行数维度的信息。
举个遍历的示例代码:
#include <stdio.h> #define M 3 int function(int N, int (*myarray)[M], double y) { // 遍历整个二维数组 for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { printf("%d ", myarray[i][j]); } printf("\n"); } return 0; } int main() { int N = 2; int myarray[2][3] = {{1,2,3}, {4,5,6}}; function(N, myarray, 3.14); return 0; }
内容的提问来源于stack exchange,提问作者user18198735
相关产品推荐
相关产品推荐

