二维数组传递给函数时,第二个下标有何作用?
二维数组传递给函数时,第二个下标有何作用?
咱们先搞清楚C语言里二维数组传参的本质:二维数组其实是「数组的数组」,比如int arr[3][5],本质是一个包含3个元素的数组,每个元素又是一个包含5个int的一维数组。当你把它传给函数时,它会退化成一个指向一维数组的指针(也就是int (*arr)[5]这种类型),可不是二维指针哦。
那第二个下标(也就是列数)的核心作用,就是帮编译器计算内存地址的偏移量:
- 当你在函数里写
arr[i][j]时,编译器需要知道每一行有多少个元素,才能算出从指针起始位置,跳过多少个字节才能定位到第i行第j列的元素。 - 如果不指定第二个下标,编译器根本摸不清每个行数组的长度,也就没法正确解析
arr[i][j]对应的内存位置,直接就会编译报错。
正如《C程序设计语言》里提到的:
数组仅第一维度(下标)可自由指定;第二维度下标必须指定:若要将二维数组传递给函数,函数中的参数声明必须包含列数;行数无关紧要,因为传递的是指向行数组的指针,其中每行是一个包含5个int的数组。
举个实际的例子,正确的函数声明可以是这样的:
// 两种写法等价,都明确指定了列数为5 void print_arr(int arr[][5], int rows) { for (int i = 0; i < rows; i++) { for (int j = 0; j < 5; j++) { printf("%d ", arr[i][j]); } printf("\n"); } } // 或者用指针形式声明 void print_arr(int (*arr)[5], int rows) { // 逻辑和上面完全一致 }
这里的行数rows只是用来控制循环范围,编译器并不依赖它来计算内存偏移,所以可以随便传;但列数5必须在参数里明确写死,不然编译器就“搞不懂”数组的内存布局了。
内容的提问来源于stack exchange,提问作者Suraj
相关产品推荐
相关产品推荐

