在单行上从普通变量声明双指针
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;
}
我同意复合文字是获取地址地址(指向指针的指针)的好方法,但请务必小心。
如何声明双指针并直接从普通变量赋值?
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;
}
我同意复合文字是获取地址地址(指向指针的指针)的好方法,但请务必小心。