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 todouble*
分配给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不起作用