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

时间:2019-04-05 10:01:56

标签: c pointers dereference double-pointer

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

{
    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?

}

2 个答案:

答案 0 :(得分:6)

对于您的问题,由于您使require(Matrix) dataset$target.category <- factor(dataset$target.category) dataset$source.category <- factor(dataset$source.category) res <- sparseMatrix( as.integer(dataset$target.category), as.integer(dataset$source.category), x = dataset$total ) res <- res/rowSums(res) 指向ptr,因此,进行&a的结果与进行*ptr的结果相同,这为您提供了*(&a)指向的位置,即&a的值。但是从语义上讲这是不正确的,如果a的大小(实际上是int *的大小与*ptr的大小({{1是什么) }}是。

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


您说“指针的双指针存储地址”,这是正确的。指向指针的指针可以存储指针的地址(指针)。但是a不是指针的地址,它是非指针变量10的地址。

要使“双指针”(实际上是指向指针的指针)起作用,您需要类似

&a

此后,aint 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 | --> | a |
+--------+     +-----+     +---+

答案 1 :(得分:-1)

  

双指针仅存储指针的地址不是真的吗?

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

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

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

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

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

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

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