在一个单一变量中可以有多少个指针 (*
)?
让我们考虑以下示例。
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;
2004年的MISRA C标准中的规则17.5禁止超过2个指针间接层级。
Use of more than 2 levels of indirection can seriously impair the ability to understand the behavior of the code, and should therefore be avoided.
这些是该组织设定的指南,而非语言标准所设定的规则。 - Francis Cugler不存在所谓的真正的限制,但是确实存在限制。所有指针都是变量,通常存储在堆栈而不是堆中。堆栈通常很小(在某些链接期间可以更改其大小)。因此,假设您有4MB的堆栈,这是相当正常的大小。假设我们有一个指针,它的大小为4个字节(指针大小取决于架构、目标和编译器设置而不同)。
在这种情况下,4 MB / 4 b = 1024
,因此可能的最大数量将是1048576,但我们不应忽略堆栈中的其他一些内容。
然而,一些编译器可能具有指针链的最大数量,但限制是堆栈大小。因此,如果您在链接期间将堆栈大小增加到无限,并且拥有运行处理该内存的操作系统的内存无限的机器,则将拥有无限的指针链。
如果您使用int *ptr = new int;
并将指针放入堆中,则不是那么通常的方式,限制将是堆大小,而不是堆栈。
编辑 刚刚意识到 infinity / 2 = infinity
。如果机器有更多的内存,指针大小会增加。因此,如果内存是无限的,指针大小也是无限的,那么这是一个坏消息... :)
new int*
)。
B) 一个 int*
和一个 int**********
在合理的架构中大小相同。 - user142019int*
和int**********
具有相同的大小,我并没有说它们不同。 - ST3这取决于您存储指针的位置。如果它们在堆栈中,您的限制相当低。如果您将其存储在堆中,则限制要高得多。
看看这个程序:
#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个指针,并显示了每个指针指向的内容,很容易注意到链条指向第一个变量number
。
顺便说一下,它使用了92K
的RAM,所以想象一下你可以深入多少。
std::shared_ptr<shared_ptr<shared_ptr<...shared_ptr<int>...>>>
这样的东西。 - josefx(pow (std::shared_ptr, -0.3))<T> x;
的-0.3间接层级。 - user180247