C 如何在堆上创建指向指针的指针

C 如何在堆上创建指向指针的指针,c,C,我正在努力创建一个指向堆上指针的指针。这是我的密码: double a = 2.289; double** ptr = (double*) malloc(sizeof(double*)); double*** ptr_to_ptr = (double*) malloc(sizeof(double*)); 我希望ptr变量保留a的地址和ptr\u to\u prtptr的地址。然后如何取消对值的引用。我想这样做: printf("%lf", **ptr_to_ptr);

我正在努力创建一个指向堆上指针的指针。这是我的密码:

double a = 2.289;

double** ptr = (double*) malloc(sizeof(double*));
double*** ptr_to_ptr = (double*) malloc(sizeof(double*));
我希望ptr变量保留
a
的地址和
ptr\u to\u prt
ptr的地址。然后如何取消对值的引用。我想这样做:

printf("%lf", **ptr_to_ptr);

Thx预先

您需要一个额外的星号才能有正确的类型:

double a = 2.289;
double** ptr = (double**) malloc(sizeof(double*));
double*** ptr_to_ptr = (double***) malloc(sizeof(double**));
要取消引用,您将需要尽可能多的星号,以确定要降低的级别数量。请参见示例:

int x = 5;
int *p = &x;
int **p2 = &p;

printf("%p %p\n",*p2, p); //If you use 1 asterisk you get to p
printf("%d", **p2); // If you use 2 asterisks you get what p points to, which is an int in this case
 

这显示了如何指向和检查堆栈上指针的地址

#包括
int main(){
双X=2.25;
双*pX=&X;
双**ppX=&pX;
printf(“地址X:%8X\n”、&X);
printf(“地址pX:%8X\n”和&pX);
printf(“地址ppX:%8X\n”、&ppX);
printf(“valx:%f”,ppX);
}
这将演示如何在堆上指向和显示地址

#包括
#包括
int main(){
双X=2.25;
double**pX=(double**)malloc(sizeof(double**));
double***ppX=(double***)malloc(sizeof(double***));
*pX=&X;
*ppX=&*pX;
printf(“地址X:%8X\n”、&X);
printf(“地址pX:%8X\n”和*pX);
printf(“Addr ppX:%8X\n”和*ppX);
printf(“Val X:%f”,***ppX);
}
您将从堆中获得一个空间,并在其中存储地址,所以您只需要为“X”的保存地址使用指向指针的指针

编辑1:

为了更好地回答评论,我把代码放在这里

下面的代码显示使用和操作员

“&”运算符只获取变量的地址,所以*&获取该变量的地址值

现在看下面的代码bot设置值x,两者都正确

#包括
int main(){
int X;
*&X=10;
printf(“X:%d\n”,X);
X=20;
printf(“X:%d\n”,X);
}

Casting to
double*
分配给
double**
是不正确的。
double**
的正确类型当然是
double**
。类似地,双***。此外,在分配
ptr
时,通常最好使用
sizeof*ptr
,而不是
sizeof(某些类型)
,由于前者避免了将类型与所分配对象匹配时的错误,并在指针声明更改时自动调整。但是如何将ptr的地址分配给ptr_to_ptr?
ptr
不能同时“保留
a
的地址”和保留
malloc
返回的值。您可以让
ptr
保存
malloc
返回的值,并
*ptr
保存
a
的地址。你想要什么?这能回答你的问题吗
malloc(sizeof(double**))
double**
分配空间,但将其分配给
double**
,后者指向
double*
。C标准允许不同类型的指针具有不同的大小,因此这是不正确的。通常,在为某些变量
pX
分配空间时,最好使用变量
sizeof*pX
,而不是使用类型名称来指定大小。这既可以避免上述错误,也可以在变量声明更改时自动调整。这几乎是正确的,但如果我们执行*&ppX=&px,则会更好。无论如何,非常感谢您的帮助,有人能解释一下为什么*&ppX=&px可以工作,但是*ppX=&px不能工作吗?首先,您必须知道这个“&”运算符是什么,“&”运算符得到变量的地址,所以当您使用&x时,您可以得到存储x的地址,现在当您使用*&x时,您可以得到地址“x”的值,现在看看这个int x*&x=10;//与此相同x=10;但我仍然不清楚为什么在这种情况下,*ppX=&px不起作用