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
的指针,不能直接取消引用。