双指针仅存储指针的地址不是真的吗? 然后如何存储整数地址?
{
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?
}
答案 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
此后,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 | --> | 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:您必须收到编译器警告。他们给出了一些提示。