【发布时间】:2020-10-11 04:37:45
【问题描述】:
我想将二维数组传递给函数。我必须在形式参数中使用单个指针接收二维数组。
【问题讨论】:
-
如果你有
int arr[3][8];,那么你的参数就是int (*)[8]。 (指向数组的指针int[8])
标签: c function multidimensional-array
我想将二维数组传递给函数。我必须在形式参数中使用单个指针接收二维数组。
【问题讨论】:
int arr[3][8];,那么你的参数就是int (*)[8]。 (指向数组的指针 int[8])
标签: c function multidimensional-array
关于:
printf("%s ", str_arr + sizeof(char) * n * i);
稍微改写:
printf("%s ", &str_arr[n * i];
显示代码正在逐步遍历数组str_arr[][] 占用的内存,并且“输出转换”说明符%s 表示要输出字符串,从str_arr[0] 开始并将整个数组视为单个连续的一组字节。其中循环的第二次迭代访问str_arr[7],循环的第三次迭代访问str_arr[14]等。
【讨论】:
在 C 中,当你有一个二维数组时,你就有一个 一维数组的数组。在访问时,数组被转换为指向其第一个元素的指针。 C11 Standard - 6.3.2.1 Other Operands - Lvalues, arrays, and function designators(p3) 对于数组数组,它是指向第一个数组 的指针。所以您的指针是type[DIM] 的指向数组的指针(其中DIM 是数组的维度。
例如,如果您有一个整数数组,例如int arr[3][5];,然后在访问时你有一个 pointer-to-array int[5]。正式类型为int (*)[5]。
例子:
#include <stdio.h>
#define COLS 5
/* print the contents of a 2d array */
void prn2d (int (*a)[COLS], int rows)
{
for (int i = 0; i < rows; i++) {
for (int j = 0; j < COLS; j++)
printf (" %2d", a[i][j]);
putchar ('\n');
}
}
int main (void) {
int arr[][COLS] = { {1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
{11, 12, 13, 14, 15} },
n = sizeof arr/sizeof *arr;
prn2d (arr, n); /* pass arr to your function */
}
使用/输出示例
$ ./bin/pass2darr
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
【讨论】:
int (*a)[COLS] 是一个单指针。您要么传递行数,要么使用 Sentinel 来标记数组的结尾。您可以将 Sentinel NULL 与 pointer-to-pointer 一起使用——但这与 Array 无关。
int (*a)[COLS] is a Single Pointer" -- 但是这种指针算法 (a[i][j]) 表明 a 是双指针,不是吗?
a[i][j] 只是从当前指针中删除 2 级 indirection 。 a[i][j] = *(*(a + i) + j),等等... 间接级别是由 array 还是 pointer 引起的,取决于类型,并不意味着 pointer-to-pointer i> 必然。 pointer-to-pointer 与 pointer-to-array 是分开且不同的。使用 pointer-to-pointer p + 1 前进到下一个 pointer。使用 pointer-to-array,p + 1 前进到下一个 Array。
#include <stdio.h>
void func(char* str_arr, int m, int n)
{
for (int i = 0; i < m; i++) {
printf("%s ", str_arr + n * i);
}
printf("\n");
}
int main()
{
char str_arr[5][7] = {"But,", "what", "is", "the", "point?"};
func((char*) str_arr, 5, 7);
return 0;
}
输出
But, what is the point?
输出是我的问题(- -)
【讨论】:
rows * cols * sizeof (type)字节的内存块。当您丢弃column 信息,然后从0 -> rows * cols * sizeof (type) 为数组下标时,下标超过了第一个数组的末尾(以及所有其他数组,因为您的索引现在超出了所有一维数组的范围)。可以,但是...