【发布时间】:2015-02-24 08:35:48
【问题描述】:
我们可以将二维数组作为单指针和双指针传递。但在第二种情况下,输出不如预期。那么第二个代码有什么问题呢?
方法一:
#include <stdio.h>
void print(int *arr, int m, int n)
{
int i, j;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
printf("%d ", *((arr+i*n) + j));
}
int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int m = 3, n = 3;
print((int *)arr, m, n);
return 0;
}
输出:
1 2 3 4 5 6 7 8 9
方法二:
#include <stdio.h>
void print(int *arr[], int m, int n)
{
int i, j;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
printf("%d ", *((arr+i*n) + j));
}
int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int m = 3;
int n = 3;
print((int **)arr, m, n);
return 0;
}
输出:
1 3 5 7 9 3 0 -1990071075 0
【问题讨论】:
-
“我们可以将二维数组作为单指针和双指针传递” - 您可以将它作为四元指针传递给
char。这并不意味着它是一个好主意,或定义的要利用的行为(它不是,也不是)。对int**的硬性转换以及没有它的代码编译失败应该暗示你会以这种方式出现一些邪恶的事情。int**是指向int的指针的指针arr到作为表达式的指针的合法转换是int (*)[3]。这些类型不等价。数组不是指针,不管你可能被引导相信什么。 -
C 中的一条经验法则是避免使用二维数组。只需使用一维数组并以
a[i*width+j]的身份访问它... -
但是@BasileStarynkevitch 在我的项目中我必须将二维数组传递给函数,所以我无法避免二维数组
-
您可以始终避免使用 2D 数组:它们不存在于硬件中,而 C 是(或曾经是)一种旨在接近硬件的语言。跨度>
-
我在第一条评论中已经给出了。
标签: c arrays function pointers