C 给定指针的地址,如何获取它指向的内容?

C 给定指针的地址,如何获取它指向的内容?,c,C,如果给定了指针的地址,如何获取指针指向的内容?一元*运算符返回或设置内存位置的值 例如: int val = 42; int* ptr = &val; assert(val == *ptr); 如果你有一个指针的地址,你可以写**pointerpointer一元*操作符 int *ptr = malloc(sizeof(int)); *ptr = 45; printf("address: %p, value: %d", ptr, *ptr); int **double_pointer

如果给定了指针的地址,如何获取指针指向的内容?

一元
*
运算符返回或设置内存位置的值

例如:

int val = 42;
int* ptr = &val;
assert(val == *ptr);

如果你有一个指针的地址,你可以写
**pointerpointer

一元
*
操作符

int *ptr = malloc(sizeof(int));
*ptr = 45;
printf("address: %p, value: %d", ptr, *ptr);
int **double_pointer = given;
int *int_pointer = *double_pointer;
int value = *int_pointer;
你的意思可能是:

/**
  * @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);
}

假设它是一个有效指针,您可以使用一元
*
运算符:

int *ptr = ...;
int x;
x = *ptr;

给出指针地址的最常见方法是通过指向指针的指针。如果指针指向的值是整数,则指针地址的类型为
int**

要获取指向整数的指针,需要取消对双指针的引用。然后可以取消对整数指针的引用以获取整数值

要取消对指针的引用,请使用
*
运算符

int *ptr = malloc(sizeof(int));
*ptr = 45;
printf("address: %p, value: %d", ptr, *ptr);
int **double_pointer = given;
int *int_pointer = *double_pointer;
int value = *int_pointer;
您还可以将解引用链接在一行上

int **double_pointer = given;
int value = **double_pointer;

根据编译器是否对引用的数据有线索,您的问题有两种可能的答案

声明类型为
int*
char*
mytype*
的指针会指示编译器,以后使用一元
*
运算符对其进行解引用时,必须分别产生
int
char
mytype
的结果

在另一种情况下,通常将指针存储在
void*
(通用的非类型指针)或
uintpttr\t
(与指针大小相同但没有指针语义的无符号int)中。在这种情况下,编译器不知道如何解释解引用运算符,因此必须显式地将此类指针转换为另一个指针类型,然后才能解引用它:

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 */

请注意,在编译的非托管语言(如C)中,没有关于指针指向哪种数据的运行时信息,不像Java这样的语言,在Java中可以使用
instanceof
操作符来检查引用在运行时真正指向的是什么

void foo(void *ptr)
{
  ...
}
例如,
ptr
的值是指向
int
的指针,您可以执行以下操作

void foo(void *ptr)
{
  int x = **((int **) ptr);
  ...
}
基本上,您可以将
ptr
转换为
int**
,然后双重取消引用它


如果您事先不知道目标类型是什么(例如,函数用于处理指向多个类型的指针),那么您必须找出一种方法,在第二个参数中编码该类型信息并将其传递给函数

你知道它指的是什么吗?或者您是否有类似于
void*
?…的指针,除非它是类型为
void*
uintptr\t
的指针,不能直接取消引用。