Joe*_*y74 2 c pointers casting
pthreads.h当我遇到这种代码时,我正在阅读使用库编程的线程指南.不完全是这样,但事情是void *指针解除引用.
#include <stdio.h>
void func(void * x) {
printf("%d\n", (int) x);
}
int main() {
int x = 10;
func((void *) x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么我可以使用
(int) x
Run Code Online (Sandbox Code Playgroud)
用于解除void *指针func?
我认为必须是这样的:
* ((int *) x)
Run Code Online (Sandbox Code Playgroud)
关于main函数中这行代码的类似问题:
func((void *) x);
Run Code Online (Sandbox Code Playgroud)
我甚至没有得到x变量的地址.
x在做的时候你不会取消引用(int) x.您只需将指针(或多或少地址)转换为int可以打印的数字表示形式.
编辑:顺便说一句,转换x为有符号整数(int)应该给你一个编译器警告.处理这个问题的更恰当的方法是
printf("%p\n", x);
Run Code Online (Sandbox Code Playgroud)
%p是一种特殊的格式说明符,它将传递给printf指针(地址说明符)的东西解释为十六进制打印,这在处理地址时通常更有用.
编辑2:顺便说一句,取消引用x,你首先必须给它一个有意义的指针类型:
char a = *((char*)x);
Run Code Online (Sandbox Code Playgroud)
将设置a为存储在p包含的地址的字符.