如果给出了指针的地址,我如何得到指针指向的内容?
答案 0 :(得分:5)
你的意思是:
/**
* @param pointer_to_pointer_to_int: the address of a pointer to an integer.
**/
void function_that_takes_pointer_to_pointer(int **pointer_to_pointer_to_int) {
int the_int = **pointer_to_pointer_to_int;
printf("The pointer points to %d\n", the_int);
}
答案 1 :(得分:3)
假设它是一个有效的指针,你可以dereference使用一元*
运算符:
int *ptr = ...;
int x;
x = *ptr;
答案 2 :(得分:1)
一元*
运算符。
int *ptr = malloc(sizeof(int));
*ptr = 45;
printf("address: %p, value: %d", ptr, *ptr);
答案 3 :(得分:1)
给出指针地址的最常用方法是通过指向指针的指针。如果指针指向的值是整数,则指针的地址类型为int **
。
要获取指向整数的指针,需要取消引用双指针。然后,您可以取消引用整数指针以获取整数值。
要取消引用指针,请使用*
运算符。
int **double_pointer = given;
int *int_pointer = *double_pointer;
int value = *int_pointer;
您也可以将取消引用链接在一行上。
int **double_pointer = given;
int value = **double_pointer;
答案 4 :(得分:0)
一元*
运算符返回或设置内存位置的值。
例如:
int val = 42;
int* ptr = &val;
assert(val == *ptr);
如果你有指针的地址,你可以写**pointerpointer
。
答案 5 :(得分:0)
根据编译器是否有关于所引用数据的线索,您的问题有两种可能的答案。
声明类型为int *
,char *
或mytype *
的指针指示编译器稍后尝试使用一元*
运算符取消引用它必须产生{的结果分别为{1}},int
或char
。
在另一种情况下,您通常会将指针存储在mytype
(通用,无类型指针)或void *
中(指针大小与指针相同但无指针语义) )。在这种情况下,编译器不知道如何解释解除引用操作符,因此必须显式地将这样的指针强制转换为另一个指针类型,然后才取消引用它:
uintptr_t
请注意,在像C这样的已编译的非托管语言中,没有关于指针指向哪种数据的运行时信息,这与Java之类的语言不同,您可以使用int x = 5;
void *p = &x; /* p now points to an int, but the compiler doesn't know it */
printf("%d\n", *((int *) p)); /* we know what we did and don't rely on the compiler */
printf("%d\n", *p); /* compile-time error, dereferencing has undefined semantics */
运算符来检查引用是什么指着运行时。
答案 6 :(得分:0)
关闭RedX的评论,如果您遇到类似
的情况void foo(void *ptr)
{
...
}
其中ptr
的值是指向int
指针的指针,例如,您可以执行类似
void foo(void *ptr)
{
int x = **((int **) ptr);
...
}
基本上,您将ptr
转换为int **
,然后双重取消引用它。
如果你不提前知道目标类型是什么(例如,该函数是为了处理多种类型的指针),那么你将不得不弄清楚在第二个参数中编码该类型信息并将其传递给函数的方法。