传递2d数组函数时单指针和双指针有什么区别?

Pan*_*ato 3 c arrays pointers function

我们可以将2d数组作为单个指针传递,也可以传递双指针.但在第二种情况下,输出不如预期.那么第二个代码有什么问题?

方法1:

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

1 2 3 4 5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)

方法2:

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

1 3 5 7 9 3 0 -1990071075 0
Run Code Online (Sandbox Code Playgroud)

Dav*_*eri 5

第一个是未定义的行为:使用单个指针访问2D数组.

第二个是完全错误的,你不能将2D数组(arr[][3])传递给int指针数组(*arr[]),看一下将2维数组传递给函数的正确方法:

void print(int *arr[], int m, int n)
Run Code Online (Sandbox Code Playgroud)

一定是

void print(int arr[][3], int n) /* You don't need the last dimesion */
Run Code Online (Sandbox Code Playgroud)

要么

void print(int (*arr)[3], int n) /* A pointer to an array of integers */
Run Code Online (Sandbox Code Playgroud)

但是这样,arr [] [3]中的列必须是全局定义的.没有任何其他解决方法吗?

在C99下你可以使用VLA(可变长度数组):

void print(int rows, int cols, int arr[rows][cols])
Run Code Online (Sandbox Code Playgroud)

  • 纠正我,如果我错了,但是我看到它的方式,他将矩阵视为线性化数组(计算索引)而没有实际的索引,我相信这是完全合法的(frist case). (2认同)
  • @PankajMahato,在C99下你可以使用[VLA](http://en.wikipedia.org/wiki/Variable-length_array) (2认同)