双指针存储指针的地址不是真的吗? 然后它如何存储整数地址?
{
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:你一定收到编译器警告。他们给出了一些提示。