C语言 为什么要显式地引用指向struct数组的指针,而不是仅仅通过指针?



到目前为止,我总是这样访问指向struct数组的指针:

struct blah *ptr; ptr[10].member = 1;

我最近意识到另一种方法:

struct blah (*array_ptr)[]; (*array_ptr)[10].member = 1;

我发现的唯一限制是,它禁止array->member访问强制使用[]。

:显式[]方法对a)人类或b)两种方法之间的编译器是否有任何优点/缺点?

对于人类来说,我猜这使得指针明确指向数组,而不是"正常"使用,它是不明确的。

到目前为止,我总是这样访问指向struct数组的指针:

struct blah *ptr; ptr[10].member = 1;

演示指向结构体的指针(恰好是至少包含11个这样的结构体的数组的元素),而不是指向结构数组的指针。然而,它是struct blah数组将衰减到的指针类型。

我最近意识到另一种方式:

struct blah (*array_ptr)[]; (*array_ptr)[10].member = 1;

是一个指向[数目不详]结构体数组的指针。

这两个指针所指向的地址可以是相同的,但是指针的类型不同。

我发现的唯一限制是它禁止array->member访问强制[]使用

您可以使用任意一种形式间接访问struct blah对象。是的,由于指针类型不同,这两种情况的语法是不同的。

问题:显式[]方法是否有任何优点/缺点A)人类还是b)两种方法之间的编译器?

我敢说大多数人发现结构指针的变化比数组指针的版本更容易阅读和理解。对于编译器来说,这应该没有什么区别,因为如果array_ptr指向的数组的第一个元素是*ptr,并且该数组确实至少有11个元素,那么这两个示例赋值是100%相等的。

对于人类,我猜它明确表示指针指向an

指针总是可以被认为指向数组,尽管该数组可以是长度为1的数组。试图区分它们没有特别的用处,至少不能通过改变指针的类型来区分。当你有指向长度已知的数组的指针时(例如:struct blah (*array11_ptr)[11];),它会变得更有趣,更有用,但我没有看到很多用例用于你的未指定长度的版本。

最新更新