即使在转换了一个void指针之后,我在解除引用时也遇到了编译错误.有谁能请让我知道这个的原因.
int lVNum = 2;
void *lVptr;
lVptr = (int*)&lVNum;
printf("\nlVptr[60 ] is %d \n",lVptr[1]);
Run Code Online (Sandbox Code Playgroud)
Dav*_*son 24
取消引用void指针没有意义.编译器如何解释指针指向的内存?您需要先将指针强制转换为正确的类型:
int x = *(int*)lVptr;
Run Code Online (Sandbox Code Playgroud)
tep*_*pic 22
printf("\nlVptr[60 ] is %d \n", *(int*)lVptr);
这会将void指针强制转换为指向a的指针int,然后正确地取消引用它.
如果你想将它视为一个数组(一个),你可以做一个有点丑陋((int *)lVptr)[0].使用[1]是出界的,因此不是一个好主意(至于lVptr[60]...)
小智 7
您不能取消引用void指针,因为它没有类型,首先您需要对其进行强制转换(int *)lVptr,然后取消引用它*(int *)lVptr。
int lVNum = 2;
void *lVptr;
lVptr = &lVNum;
printf("\nlVptr[60 ] is %d \n",*(int *)lVptr);
Run Code Online (Sandbox Code Playgroud)
它仍然是一个,void*因为那是你声明的那样。任何指针都可以隐式转换为 a void*,因此 cast 什么都不做,您只剩下一个指针,void就像开始时一样。
您需要将其声明为int*.
void *some_ptr = /* whatever */;
int *p = (int*)some_ptr;
// now you have a pointer to int cast from a pointer to void
Run Code Online (Sandbox Code Playgroud)
注意,投给一个int*也是不必要的,出于同样的原因,你不必(也应该不)投的返回值malloc在C.
void*'s 可以与任何其他指针类型进行隐式转换。我在这里添加演员表只是为了清楚起见,在您的代码中您只需编写;
int *p = some_void_ptr;
Run Code Online (Sandbox Code Playgroud)
还有这个:
lVptr[1]
Run Code Online (Sandbox Code Playgroud)
是错的。你有一个指向单个的指针int,而不是两个。这种取消引用会导致未定义的行为。