我们可以有多少级别的指针?
单个变量允许多少个指针( *
)?
我们来考虑下面的例子。
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?