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

让我们考虑下面的例子。

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

类似地,我们可以有

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

等等。

例如,

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

当前回答

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

其他回答

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

这取决于你存储指针的位置。如果它们是堆叠的,极限就会很低。如果你把它存储在堆里,你的极限会非常非常高。

看看这个程序:

#include <iostream>

const int CBlockSize = 1048576;

int main() 
{
    int number = 0;
    int** ptr = new int*[CBlockSize];

    ptr[0] = &number;

    for (int i = 1; i < CBlockSize; ++i)
        ptr[i] = reinterpret_cast<int *> (&ptr[i - 1]);

    for (int i = CBlockSize-1; i >= 0; --i)
        std::cout << i << " " << (int)ptr[i] << "->" << *ptr[i] << std::endl;

    return 0;
}

它创建了1M个指针,并在显示什么指向什么时很容易注意到链到第一个变量数。

顺便说一句。它使用92K的RAM,所以想象一下你能走多深。

从理论上讲:

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

实际:

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

参考资料如下:

5.2.4.1翻译限制:

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

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

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

没有限制,查看例子在指针::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 */

如果你的意思是“在程序变得难以阅读之前,你可以使用多少层指针”,这是一个品味的问题,但有一个限制。有两层间接(一个指针指向另一个指向某物的指针)是很常见的。再多一点就很难想象了;除非另一种选择会更糟,否则不要做。

如果您的意思是“在运行时可以有多少层指针间接”,则没有限制。这一点对于循环列表尤其重要,因为循环列表中的每个节点都指向下一个节点。您的程序可以永远跟随指针。

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

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

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

int **q = &p;

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

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

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

是被允许的。