【问题标题】:why we must typecast the 2D array when passing to function using single pointer?为什么在使用单指针传递给函数时必须对二维数组进行类型转换?
【发布时间】:2014-08-14 05:47:30
【问题描述】:

嗨,我试图使用单指针传递二维整数数组。我知道我必须 传递给函数之前的类型转换数组

谁能解释为什么我们需要在传递我的代码之前进行类型转换如下?

 #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;
 }

【问题讨论】:

标签: c pointers casting


【解决方案1】:

因为没有强制转换的arr 会衰减为int (*)[3](指向3 个ints 的块),而您的函数期待int *(指向1 int 的指针)..

【讨论】:

  • sorry what is int (*)[3] 它是指向数组的指针吗?请你能详细解释一下吗?请即使我无法弄清楚我的函数如何期待 int *?
  • 你不能将数组按值传递给函数,它会衰减为指针,int arr[3] 会衰减为int *,int arr[][3] 会衰减为int (*arr)[3],你的函数需要知道数组最后一维的大小,arr + 1 = arr + 4 字节 arr = int * 和 arr + 1 = arr + 12 字节 arr = int (*arr)[3] 时,请原谅我可怜的英语
【解决方案2】:

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

只需将二维数组传递给您的函数:

 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]); 
 }

【讨论】:

    【解决方案3】:

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

    属性更改示例:

    在 main 函数中,如果你增加 arr + 1 12 个字节,则会增加 12 个字节,但在打印函数的情况下,arr + 1 只会增加 4 个字节。

    【讨论】:

    • @SumitKumar 除了在您的平台上假设int 的大小之外,如果它引用 elements 而不是这个答案中的“数学”,那么它的混淆就会大大减少比字节。在main 中,arr 是一个数组数组。每个外部维度“元素”都是三个int 的数组。在您的函数中,arr 是一个简单的指向 int 的指针。每个“元素”都是一个 int。
    • 在打印函数中,arr 是一个整数指针。指针大小为 4 个字节。因此,当您增加 arr+1 时,将增加 4 个字节。
    • @mahendiran.b 最后的评论是完全错误的。 “指针大小”与指针数学和其中 bytes 的步幅无关。指针 type 决定了字节步长,而不是指针的大小。你怎么知道 int 在 OP 的平台上是 4 字节?
    • @WhozCraig 对此感到抱歉。 INTEGER 的大小为 4 个字节。所以整数指针增加了 4 个字节。
    猜你喜欢
    • 2014-03-08
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 2016-10-25
    相关资源
    最近更新 更多