指向指针的指针。我们能走多远?

Ser*_*rge 6 c++ pointers

在 C/C++ 中,我们知道指针。即可变内存地址。

说,下面的这段代码不会编译,但想法是这样的:

#include <iostream>
using namespace std;

main() {
    int* pi;
    int i = 1;
    pi = &i;
    
    while (true) {
        cout<<"i = " << i++ << "; pi = " << pi;
        pi = &pi;
    }
}
Run Code Online (Sandbox Code Playgroud)

地址的地址能走多远。“最终地址”在哪里?

int* pi = &i;
int** ppi = &pi;
int*** pppi = &ppi;
int**** ppppi = &pppi;
.....
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 3

理论上没有限制,但请记住:

  1. 您不能合法使用pi = &pi;,因为这是严格的别名违规。pi随后的读取行为是未定义的

  2. 读取取消引用未初始化的指针的行为是未定义的

  3. 读取曾经指向有效内存但不再指向有效内存的指针时的行为是不确定的。但它并不是未定义的。因此,伪代码将产生无限数量的悬空指针这一事实是没有意义的。

顺便说一下,您可以使用模板设计一个工作示例(将所有指针保留在范围内),就像使用模板实现阶乘函数一样。