在一个变量中允许有多少个指针(*)?

让我们考虑下面的例子。

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

类似地,我们可以有

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

等等。

例如,

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

当前回答

听起来很有趣。

Visual Studio 2010(在Windows 7上),在得到这个错误之前,你可以有1011个级别: 解析器堆栈溢出,程序太复杂 gcc (Ubuntu), 100k+ *没有崩溃!我想硬件是这里的极限。

(仅用变量声明进行测试)

其他回答

从理论上讲:

你可以有任意多的间接层次。

实际:

当然,任何消耗内存的操作都不能是无限的,主机环境中的可用资源会有限制。因此,实际上实现所能支持的内容是有最大限制的,实现应该适当地记录它。因此,在所有这些工件中,标准没有指定最大限度,但它指定了下限。

参考资料如下:

5.2.4.1翻译限制:

- 12个指针、数组和函数声明符(任意组合) 声明中的算术、结构、联合或空类型。

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

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

没有限制。指针是一个内存块,其内容是一个地址。 如你所说

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

指向指针的指针也是一个变量,它包含另一个指针的地址。

int **q = &p;

这里q是指针到指针的指针,持有p的地址,p已经持有a的地址。

指针指向指针没有什么特别之处。因此,存储另一个指针地址的指针链是没有限制的。 ie。

 int **************************************************************************z;

是被允许的。

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

无限指针间接是在结构的帮助下实现的,当然,不是通过直接的声明器,这是不可能的。需要一个结构体,这样你就可以在不同的层次上在这个结构中包含其他数据。

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

现在你可以有list->next->next->next->…->next。这实际上只是多个指针指向:*(*(..(*(*(*list).next).next).next…).next).next).next。当。next是这个结构的第一个元素时,它基本上就是一个noop,所以我们可以把它想象成***. ***ptr。

这实际上没有任何限制,因为链接可以通过循环来遍历,而不是像这样一个巨大的表达式,而且,结构可以很容易地变成圆形。

因此,换句话说,链表可能是添加另一层间接来解决问题的最终示例,因为您对每个推操作都是动态地进行操作的。:)

我想指出的是,生成带有任意数量*的类型是可以通过模板元编程实现的。我忘了我到底在做什么,但有人建议我可以通过使用递归T*类型来生成新的不同类型,这些类型之间具有某种元操作。

模板元编程是一个慢慢陷入疯狂的过程,所以在生成一个有几千个间接层的类型时,没有必要找借口。例如,它只是将peano整数作为函数式语言映射到模板展开的一种方便方法。

2004 MISRA C标准的17.5规则禁止超过2级的指针间接。