在一个变量中允许有多少个指针(*)?
让我们考虑下面的例子。
int a = 10;
int *p = &a;
类似地,我们可以有
int **q = &p;
int ***r = &q;
等等。
例如,
int ****************zz;
在一个变量中允许有多少个指针(*)?
让我们考虑下面的例子。
int a = 10;
int *p = &a;
类似地,我们可以有
int **q = &p;
int ***r = &q;
等等。
例如,
int ****************zz;
当前回答
从理论上讲:
你可以有任意多的间接层次。
实际:
当然,任何消耗内存的操作都不能是无限的,主机环境中的可用资源会有限制。因此,实际上实现所能支持的内容是有最大限制的,实现应该适当地记录它。因此,在所有这些工件中,标准没有指定最大限度,但它指定了下限。
参考资料如下:
5.2.4.1翻译限制:
- 12个指针、数组和函数声明符(任意组合) 声明中的算术、结构、联合或空类型。
这指定了每个实现必须支持的下限。注意,在一个脚注中,标准进一步说:
18)实现应该尽可能避免强加固定的翻译限制。
其他回答
请注意,这里可能存在两个问题:在C类型中可以实现多少层指针间接,以及在单个声明器中可以填充多少层指针间接。
C标准允许对前者施加一个最大值(并给出一个最小值)。但这可以通过多个typedef声明来避免:
typedef int *type0;
typedef type0 *type1;
typedef type1 *type2; /* etc */
因此,最终,这是一个实现问题,与C程序在被拒绝之前可以做出多大/多复杂的想法有关,这是非常特定于编译器的。
我想指出的是,生成带有任意数量*的类型是可以通过模板元编程实现的。我忘了我到底在做什么,但有人建议我可以通过使用递归T*类型来生成新的不同类型,这些类型之间具有某种元操作。
模板元编程是一个慢慢陷入疯狂的过程,所以在生成一个有几千个间接层的类型时,没有必要找借口。例如,它只是将peano整数作为函数式语言映射到模板展开的一种方便方法。
从理论上讲:
你可以有任意多的间接层次。
实际:
当然,任何消耗内存的操作都不能是无限的,主机环境中的可用资源会有限制。因此,实际上实现所能支持的内容是有最大限制的,实现应该适当地记录它。因此,在所有这些工件中,标准没有指定最大限度,但它指定了下限。
参考资料如下:
5.2.4.1翻译限制:
- 12个指针、数组和函数声明符(任意组合) 声明中的算术、结构、联合或空类型。
这指定了每个实现必须支持的下限。注意,在一个脚注中,标准进一步说:
18)实现应该尽可能避免强加固定的翻译限制。
2004 MISRA C标准的17.5规则禁止超过2级的指针间接。
没有限制,查看例子在指针::C面试问题和答案。
答案取决于您对“指针级别”的定义。如果你的意思是“在一个声明中可以有多少层间接层?”答案是“至少12层”。
int i = 0;
int *ip01 = & i;
int **ip02 = & ip01;
int ***ip03 = & ip02;
int ****ip04 = & ip03;
int *****ip05 = & ip04;
int ******ip06 = & ip05;
int *******ip07 = & ip06;
int ********ip08 = & ip07;
int *********ip09 = & ip08;
int **********ip10 = & ip09;
int ***********ip11 = & ip10;
int ************ip12 = & ip11;
************ip12 = 1; /* i = 1 */
如果你的意思是“在程序变得难以阅读之前,你可以使用多少层指针”,这是一个品味的问题,但有一个限制。有两层间接(一个指针指向另一个指向某物的指针)是很常见的。再多一点就很难想象了;除非另一种选择会更糟,否则不要做。
如果您的意思是“在运行时可以有多少层指针间接”,则没有限制。这一点对于循环列表尤其重要,因为循环列表中的每个节点都指向下一个节点。您的程序可以永远跟随指针。