为什么我们必须在使用单指针传递函数时对2D数组进行类型转换?

时间:2014-08-14 05:47:31

标签: c pointers casting

嗨我试图用单指针传递2d整数数组。我知道我必须这样做 传递给函数之前的类型转换数组

任何人都可以解释为什么我们需要进行类型转换才能通过下面的代码?

 #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); // here why i need to typecast and pass?
      return 0;
 }

3 个答案:

答案 0 :(得分:1)

因为没有强制转换的arr会衰减到int (*)[3](指向3 int s块的指针)并且您的函数期望int *(指向1 {{1} }})..

答案 1 :(得分:1)

由于int (*)[3]int*之间没有转化,因此您必须使用强制转换来强制转换。

只需将2D数组传递给您的函数:

 void print(int a[][3], int m, int n)
 {
       int i, j;
       for (i = 0; i < m; i++)
       for (j = 0; j < n; j++)
       printf("%d ", a[i][j]); 
 }

答案 2 :(得分:0)

通常,类型转换会改变变量的属性。在main函数中,arr是一个2D数组,但print函数将arr视为指针。所以需要进行类型转换

属性更改示例:

在main函数中,如果递增arr + 1 12个字节将增加,但是在打印函数arr + 1的情况下,将仅增加4个字节。