我们可以有多少级别的指针?

单个变量允许多少个指针( * )?

我们来考虑下面的例子。

int a = 10;
int *p = &a;

同样我们可以有

int **q = &p;
int ***r = &q;

等等。

例如,

int ****************zz;

C标准规定了下限:

5.2.4.1翻译限制

276该实施应能翻译并执行至少一个程序,该程序至少包含以下每个限制的一个实例:[...]

279 - 12指针,数组和函数声明符(以任何组合方式)修改声明中的算术,结构,联合或无效类型

上限是具体实施。


实际上,C程序通常使用无限指针间接。 一个或两个静态水平是常见的。 三重间接很少见。 但无限是非常普遍的。

无限指针间接是通过struct的帮助来实现的,当然不是直接声明的,这是不可能的。 并且需要一个结构体,以便您可以在可以终止的不同级别在此结构中包含其他数据。

struct list { struct list *next; ... };

现在你可以有list->next->next->next->...->next 。 这实际上只是多指针间接指针: *(*(..(*(*(*list).next).next).next...).next).next 。 而.next基本上是noop,因为它是结构的第一个成员,所以我们可以将它想象成***..***ptr

对此没有限制,因为链接可以循环遍历而不是像这样的巨大表达式,此外,结构可以很容易地制成圆形。

换句话说,链接列表可能是添加另一个间接级别来解决问题的最终示例,因为您正在使用每个推式操作动态执行此操作。 :)


从理论上讲:

你可以拥有任意数量的间接指针。

几乎:

当然,没有任何消耗内存的东西可能是无限的,由于主机环境中可用的资源,会有限制。 所以实际上,实现可以支持的最大限制是实现,并且实现应该适当地记录它。 因此,在所有这些工件中,标准并未指定最大限制,但它确实规定了下限。

以下是参考:

C99标准5.2.4.1翻译限制:

- 12个指针,数组和函数声明符(以任何组合方式)修改声明中的算术,结构,联合或无效类型。

这指定了每个实现必须支持的下限。 请注意,在标准脚步中,标准还说:

18)实施应尽可能避免强加固定翻译限制。

链接地址: http://www.djcxy.com/p/91707.html

上一篇: How many levels of pointers can we have?

下一篇: Why does the VS2008 std::string.erase() move its buffer?