在一个变量中允许有多少个指针(*)?
让我们考虑下面的例子。
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标准规定了下限:
5.2.4.1翻译限制 实现应能够翻译和执行至少一个包含以下每个限制的至少一个实例的程序:[…] 279 - 12指针、数组和函数声明符(任意组合) 声明中的算术、结构、联合或空类型
上限是特定于实现的。
其他回答
没有限制。指针是一个内存块,其内容是一个地址。 如你所说
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。
这实际上没有任何限制,因为链接可以通过循环来遍历,而不是像这样一个巨大的表达式,而且,结构可以很容易地变成圆形。
因此,换句话说,链表可能是添加另一层间接来解决问题的最终示例,因为您对每个推操作都是动态地进行操作的。:)
C标准规定了下限:
5.2.4.1翻译限制 实现应能够翻译和执行至少一个包含以下每个限制的至少一个实例的程序:[…] 279 - 12指针、数组和函数声明符(任意组合) 声明中的算术、结构、联合或空类型
上限是特定于实现的。
没有限制,查看例子在指针::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 */
如果你的意思是“在程序变得难以阅读之前,你可以使用多少层指针”,这是一个品味的问题,但有一个限制。有两层间接(一个指针指向另一个指向某物的指针)是很常见的。再多一点就很难想象了;除非另一种选择会更糟,否则不要做。
如果您的意思是“在运行时可以有多少层指针间接”,则没有限制。这一点对于循环列表尤其重要,因为循环列表中的每个节点都指向下一个节点。您的程序可以永远跟随指针。
2004 MISRA C标准的17.5规则禁止超过2级的指针间接。