在单行上从普通变量声明双指针

Declare double pointer from normal variable on single line

如何声明双指针并直接从普通变量赋值?

int a = 5;
int* b = &a;
int** c = &b;
int** d = &&a;//This does not work
int** e = &(&a);//This does not work

How can I declare a double pointer and assign its value directly from a normal variable

你不能。 “双指针”不是 C 中的特殊结构。它是指针到指针的简称。指针总是指向一个变量,即具有内存位置的东西。 &a 是一个“右值”,而不是一个变量。它没有内存位置,因此您无法指向它。

由于 中所述的原因,&&a 无法正常工作。

但是,您可以借助 C99 中添加的复合文字 在单个表达式中形成所需的指针。您可以将这些文字视为未命名的局部变量。复合文字是 不是 临时但完全合法的左值。拿他们的地址是安全的。

int** d = &(int*){&a};

tstanisl 建议使用复合文字,这是一个很好的方法,但要小心。它们具有自动作用域,因此在您使用它们的函数 return 之后它们将无法生存。

在下面的代码中,a 是全局的,不会超出范围,但我们存储在复合文字中的地址会超出范围。在 foo 中使用它没有问题,但是一旦我们从 foo return,我们 return 指向的指针可能会被覆盖。 (如果您没有发现问题,请尝试在调用 foo 和打印之间调用一些函数)。

#include <stdio.h>

int a = 42;
int **foo(void)
{
    int **d = &(int *){&a};
    printf("no problem here: %d\n", **d);
    return d;
}

int main(void)
{
    int **p = foo();
    printf("but a big problem here: %d\n", **p);
    return 0;
}

另一个问题是代码中相同的复合文字是相同的内存,所以如果你在循环中使用一个,例如,你不会在每次迭代中获得新的内存;内存被重用。

在这段代码中,我们有一个整数数组,我们 运行 通过它并获得指向每个整数的复合文字指针的地址。满嘴的。

p中的所有指针最终将指向同一个地址,复合文字所在的地址。

#include <stdio.h>

int main(void)
{
    int a[5] = {1, 2, 3, 4, 5};
    int **p[5];

    for (int i = 0; i < 5; i++)
    {
        p[i] = &(int *){&a[i]};
    }

    for (int i = 0; i < 5; i++)
    {
        printf("*p[%d] = %p\n", i, *p[i]);
        printf("**p[%d] = %d\n", i, **p[i]);
    }

    return 0;
}

我同意复合文字是获取地址地址(指向指针的指针)的好方法,但请务必小心。