c - 取消引用 void 指针

标签 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;
}

为什么我只能用

(int) x

func 中取消引用 void * 指针?

我认为它必须是这样的:

* ((int *) x)

关于main函数中这行代码的类似问题:

func((void *) x);

我什至没有在这里得到 x 变量的地址。

最佳答案

在执行 (int) x 时,您没有取消引用 x。您只需将一个指针(或多或少是一个地址)转换为一个 int,它是一种数字表示形式,可以打印出来。

编辑:顺便说一句,将x 转换为有符号整数(int) 应该会给您一个编译器警告。 处理这个问题的正确方法是

printf("%p\n", x);

%p 是一种特殊的格式说明符,它将传递给printf的东西解释为一个指针(地址说明符),以十六进制打印,这通常更有用在处理地址时。

EDIT2:顺便说一下,要取消引用 x,您首先必须给它一个有意义的指针类型:

char a = *((char*)x); 

会将 a 设置为存储在 p 包含的地址处的字符。

关于c - 取消引用 void 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29058473/

相关文章:

c - 使用指针的 for 循环优化

c++ - 将 WIN32_FIND_DATA 转换为 LPVOID

c# - 无法从 Func<T,T,T> 转换为 Func<T,T,T>

java - 如何使用相同的父类(super class)方法初始化不同的子类类型?

c++ - 内联汇编操作数约束

C 语言 - strcmp 始终返回 0 而 strcpy 不会将字符串复制到另一个数组中

C - 将指针传递给函数,然后将函数内部的相同指针传递给另一个函数

c# - 在 C# 中调用此 C 函数的正确语法是什么?该函数使用指针和数组

c - 如何在函数之间更改指针值

c - 在 64 位处理器中读取 32 位指针的结构