在一个变量中允许有多少个指针(*)?
让我们考虑下面的例子。
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;
当前回答
没有限制,查看例子在指针::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 */
如果你的意思是“在程序变得难以阅读之前,你可以使用多少层指针”,这是一个品味的问题,但有一个限制。有两层间接(一个指针指向另一个指向某物的指针)是很常见的。再多一点就很难想象了;除非另一种选择会更糟,否则不要做。
如果您的意思是“在运行时可以有多少层指针间接”,则没有限制。这一点对于循环列表尤其重要,因为循环列表中的每个节点都指向下一个节点。您的程序可以永远跟随指针。
其他回答
没有限制,查看例子在指针::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 */
如果你的意思是“在程序变得难以阅读之前,你可以使用多少层指针”,这是一个品味的问题,但有一个限制。有两层间接(一个指针指向另一个指向某物的指针)是很常见的。再多一点就很难想象了;除非另一种选择会更糟,否则不要做。
如果您的意思是“在运行时可以有多少层指针间接”,则没有限制。这一点对于循环列表尤其重要,因为循环列表中的每个节点都指向下一个节点。您的程序可以永远跟随指针。
没有真正的极限这种东西,但极限是存在的。所有指针都是通常存储在堆栈而不是堆中的变量。堆栈通常很小(在一些链接过程中可以改变它的大小)。假设你有4MB的堆栈,这是很正常的大小。假设我们有一个4字节大小的指针(指针大小取决于架构、目标和编译器设置)。
在这种情况下,4mb / 4b = 1024,因此可能的最大数字将是1048576,但我们不应该忽略堆栈中还有其他东西的事实。
然而,一些编译器可能有最大数量的指针链,但限制是堆栈大小。因此,如果你在链接过程中增加堆栈大小,让机器拥有无限大的内存,运行操作系统来处理这些内存,那么你就会有无限的指针链。
如果你使用int *ptr = new int;把指针放到堆里,这不是常用的方法限制的是堆大小,不是堆栈大小。
只要意识到无穷大/ 2 =无穷大。如果机器有更多的内存,那么指针的大小就会增加。如果内存是无穷大,指针的大小也是无穷大,这是个坏消息。:)
每个c++开发人员都应该听说过著名的三星程序员。
而且似乎真的有某种神奇的“指针障碍”必须被掩盖。
C2引用:
Three Star Programmer A rating system for C-programmers. The more indirect your pointers are (i.e. the more "*" before your variables), the higher your reputation will be. No-star C-programmers are virtually non-existent, as virtually all non-trivial programs require use of pointers. Most are one-star programmers. In the old times (well, I'm young, so these look like old times to me at least), one would occasionally find a piece of code done by a three-star programmer and shiver with awe. Some people even claimed they'd seen three-star code with function pointers involved, on more than one level of indirection. Sounded as real as UFOs to me.
请注意,这里可能存在两个问题:在C类型中可以实现多少层指针间接,以及在单个声明器中可以填充多少层指针间接。
C标准允许对前者施加一个最大值(并给出一个最小值)。但这可以通过多个typedef声明来避免:
typedef int *type0;
typedef type0 *type1;
typedef type1 *type2; /* etc */
因此,最终,这是一个实现问题,与C程序在被拒绝之前可以做出多大/多复杂的想法有关,这是非常特定于编译器的。
听起来很有趣。
Visual Studio 2010(在Windows 7上),在得到这个错误之前,你可以有1011个级别: 解析器堆栈溢出,程序太复杂 gcc (Ubuntu), 100k+ *没有崩溃!我想硬件是这里的极限。
(仅用变量声明进行测试)