为什么解除指向一个整数数组(在2d数组中)的指针返回(或衰减到)指向第一个元素的指针?

为什么解除指向一个整数数组(在2d数组中)的指针返回(或衰减到)指向第一个元素的指针?,第1张

概述我已经阅读了许多指针和二维数组关系的帖子,但我似乎无法理解概念. 假设有一个2d数组int [3] [2]和数组int b [2]. 现在a返回一个指向大小为3的整数数组的指针.它的类型为int(*)[2]. 正如我对这个概念的理解所做的那样(* a)会给我数组本身,这会衰减到指向1d数组的第一个元素并且类型为(int *)的指针.现在大胆的部分是怀疑.  为什么以及如何在数组本身(这是完整的1d 我已经阅读了许多指针和二维数组关系的帖子,但我似乎无法理解概念.
假设有一个2d数组int [3] [2]和数组int b [2].
现在a返回一个指向大小为3的整数数组的指针.它的类型为int(*)[2].

正如我对这个概念的理解所做的那样(* a)会给我数组本身,这会衰减到指向1d数组的第一个元素并且类型为(int *)的指针.现在大胆的部分是怀疑.
 为什么以及如何在数组本身(这是完整的1d数组a [0])衰减到1d数组的第一个元素时发生这种衰变? (似乎无法得到原因和部分)并且似乎无法在其他链接上找到它.

作为[0],* a,& a [0] [0]表示相同的指针.这里作为[0]是第一个1d数组.那么这是真的,b(在上面声明)和一个[0]代表相同的东西(都是1d数组然后衰减到指向类型(int *)数组中第一个元素的指针?

解决方法

why and how does this decay happen where the array itself decays to first element of the 1d array?

C11:6.3.2.1 p(3):

Except when it is the operand of the sizeof operator,the _alignof operator 1,the unary & operator,or is a string literal used to initialize an array,an Expression that has type ‘‘array of type’’ is converted to an Expression with type ‘‘pointer to type’’ that points
to the initial element of the array object and is not an lvalue.

简单;数组名称可以转换为指向其第一个元素的指针.

由于a是一个数组名称,它衰减到指向其第一个元素的指针,该元素是一维数组.它的类型是int(*)[2].由于(在衰减之后)是指向2 int数组的指针,* a是2个int的数组.由于这是一个数组类型,即* a是第一个1D数组的数组名,它衰减到指向数组对象的第一个元素(a [0] [0])的指针.所以,它的类型是int *.

is this true that b(declared above) and a[0] represent the same thing (both being 1d array and then decay to the pointer to first element in array of type (int*)?

是b和a [0]都是int *类型(衰变后).

1.阅读Keith Thompson的commat.另请阅读此answer,其中指出:C11标准的草案说数组有另一个例外,即当数组是新_alignof运算符的 *** 作数时.这是草案中的错误,在最终公布的C11标准中得到纠正; _alignof只能应用于带括号的类型名称,而不能应用于表达式.

总结

以上是内存溢出为你收集整理的为什么解除指向一个整数数组(在2d数组中)的指针返回(或衰减到)指向第一个元素的指针?全部内容,希望文章能够帮你解决为什么解除指向一个整数数组(在2d数组中)的指针返回(或衰减到)指向第一个元素的指针?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/1216073.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存