C语言 双指针到底是怎么表现的?



指针存储指针的地址不是真的吗? 然后它如何存储整数地址?

{
int **ptr,a;
a = 10;
ptr = &a; 
printf("value of a = %dn",*ptr);  //why it works?
printf("value of a = %dn",**ptr); //why it doesnt work?
}

至于你的问题,因为你把ptr指向&a,那么做*ptr会导致与做*(&a)相同的结果,这给了你&a指向哪里的值,即a的值。不过,这在语义上是不正确的,如果int *的大小(这就是*ptr真正的大小)与int的大小(这就是a的大小)不同,可能会导致其他问题。

当您执行**ptr时,您将a的值视为指针,并取消引用它。由于10不太可能是现代PC上的有效指针,因此您将获得未定义的行为


你说"指针的双指针存储地址",这是正确的。指向指针的指针可以存储指针的地址(指针)。但&a不是指针的地址,而是非指针变量a的地址。

要使"双指针"(实际上是指针到指针)起作用,您需要类似的东西

int a = 10;
int *ptr = &a;  // Make ptr point to the variable a
int **ptrptr = &ptr;  // Make ptrptr point to the variable ptr

在此之后,*ptrptr == ptr**ptrptr == *ptr**ptrptr == a

从图形上看,上面可以看到类似

+--------+ +-----+ +
---+ |PTRPTR |--> |PTR |--> |一 | +--------+     +-----+     +---+

双指针存储指针的地址不是这样吗?

不。任何类型的指针都可以存储任何内容的地址。但理想情况下,程序员应该确保有效类型的地址存储在其中。

通过执行ptr = &a;您将整数的地址存储在双指针变量中。

printf("value of a = %dn",*ptr);  //why it works?

*ptr将在ptr存储的地址处返回值。由于存储的地址是整数变量,因此它返回整数值。但请注意,返回的值将具有地址类型,因为 ptr 是双指针。但是,在printf()中,您使用%d来打印值。因此,*ptr返回的指针类型值将被类型转换为整数并打印出来。所以你可以得到适当的输出。

printf("value of a = %dn",**ptr); //why it doesnt work?

这是行不通的,因为它等同于(*(*ptr)).因此,您正在尝试读取存储在地址 10 处的整数值。我认为它不是您机器上的有效地址,或者您的程序无权读取该地址。

PS:你一定收到编译器警告。他们给出了一些提示。

相关内容

  • 没有找到相关文章

最新更新