双指针如何真正以这种方式表现?
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:您一定收到了编译器警告。他们给出了一些提示。
双指针只存储一个指针的地址不对吗? 它如何存储整数地址?
{
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:您一定收到了编译器警告。他们给出了一些提示。