取消引用void指针

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变量的地址.

Mar*_*ler 9

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包含的地址的字符.

  • 这意味着我甚至不在void*x参数中保存地址?我使用指针变量发送值不是地址? (3认同)
  • @ Joey74:简而言之,是的. (3认同)