双指针如何真正以这种方式表现?

How double pointer really behaves this way?

双指针只存储一个指针的地址不对吗? 它如何存储整数地址?

{
    int **ptr,a;
    a = 10;
    ptr = &a; 

    printf("value of a = %d\n",*ptr);  //why it works?
    printf("value of a = %d\n",**ptr); //why it doesnt work?

}

至于你的问题,因为你让 ptr 指向 &a,那么 *ptr 将导致与 *(&a) 相同的结果,这给了你&a 指向的值,即a 的值。但是它在语义上是不正确的,如果 int * 的大小(*ptr 的实际大小)与 int 的大小([=16] 的大小不同,则可能会导致其他问题=] 是).

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


你说 "double pointer store address of a pointer",这是正确的。指向指针的指针可以存储指针的地址(指针)。但是 &a 不是指针的地址,它是非指针变量的地址 a.

要使 "double pointer"(真正指向指针的指针)正常工作,您需要

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 | --> | a |
+--------+     +-----+     +---+

Is not that true that double pointer store address of a pointer only?

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

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

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

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

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

这不起作用,因为它等同于 (*(*ptr))。所以你试图读取存储在地址 10 的整数值。我认为它不是你机器上的有效地址,或者你的程序没有读取该地址的权限。

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