为啥在使用单指针传递给函数时必须对二维数组进行类型转换?

Posted

技术标签:

【中文标题】为啥在使用单指针传递给函数时必须对二维数组进行类型转换?【英文标题】: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;
 

【问题讨论】:

编译器怎么做? arr 不是指向 int 的指针。 int(*)[3]int * 是不兼容的类型 相关:***.com/questions/14012020/… 和 ***.com/questions/5329107/… ***.com/questions/4810664/how-do-i-use-arrays-in-c @AlterMann 函数期望用int* 解析二维数组的本质是错误的,因为它打算进行数组展平,它是may potentially lead to UB。 【参考方案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 个字节。

以上是关于为啥在使用单指针传递给函数时必须对二维数组进行类型转换?的主要内容,如果未能解决你的问题,请参考以下文章

将指向 int 数组的指针传递给成员函数,错误:数组下标的无效类型“int [int]”

C语言基础:指针相关概念(指针的算术运算 指针数组指向指针的指针 传递指针给函数 从函数返回指针 )为啥C 语言不支持在调用函数时返回局部变量的地址?

将二维数组指针传递给c ++中的函数[重复]

在C语言中能否直接给指针指向的数据赋值?为啥?

指针数组内容在传递给 C 中的函数时被擦除

无法使用双指针作为函数参数传递二维数组[重复]