这两个void*long转换/转换之间的区别在哪里(从Unix环境中的Advanced Programming中获取的代码)以及为什么有可能/允许编写第二种情况:

int complong(const void *arg1, const void *arg2)
{
  long l1 = *(long *)arg1;
  long l2 = *(long *)arg2;
  // ...
}

void* thr_fn(void *arg)
{
  long idx = (long)arg;
  // ...
}

#1楼 票数:4

void*long* ,您将获得一个指针,该指针指向一个long值,该值与原始指针的地址相同。 当将void*long ,您将指针指向的地址作为数字。

#2楼 票数:2 已采纳

第二个示例是线程函数经常遇到的一种形式。 指针参数可用于存储整数。

void* thr_fn(void *arg)
{
   long idx = (long)arg;
   // ...
}

例如, pthread_create函数带有多个参数,一个是指向返回void *并具有void *参数的函数的指针。

如果您的函数有多个参数,则可以传递一个指向结构类型的指针,并使用不同的成员作为void * 但是,如果您的函数具有单个整数参数,则无需使用指针,只需将整数值传递给void *参数,然后在函数中将其转换为整数即可。

例如:

thr_fn((void *) 42);

它将值42传递给函数。

#3楼 票数:1

为什么可以/允许写第二种情况?

long idx = (long)arg;

arg是一个指针,指针变量可以容纳的值是有效的内存位置或NULL。 因此,您要做的就是将此值分配给一个long型变量,该变量是完全有效的,因此此代码段将被编译。

  ask by Bade translate from so

未解决问题?本站智能推荐:

1回复

C指针转换操作

我在Raspberry Pi上摆弄GPIO访问,所以当然要涉及到内存。 这个想法是我有一个基本地址: gpios 。 根据我要执行的操作,我将在该基地址的上方进一步查找一些地址并更改一些位。 在此示例中,我想读取引脚的逻辑值。 为此,有两个寄存器,第一个位于地址(gpios + GP
5回复

C中的指针转换

为什么指针强制转换不会导致将(size_t大小)个字节从缓冲区复制到app_key定义的流中? 谢谢 编辑:我正在将此函数作为另一个函数的参数来使用callback:
3回复

转换C指针类型

我有一个指向uchar4的structre类型的ac指针,它看起来像 我也将数据作为uint8 *传入。 我想创建一个uchar *指向uint8 *上的数据,所以我尝试这样做: 但是,前8个字节似乎总是错误的。 还有另一种方法吗? 编辑: 输入数据= 32 43 F6 A8
3回复

C中的指针和转换

这次我开始学习指针了。 我试图从这个数组中读取字节。 任务快完成了,但 CLang 一直警告我,警告我不明白。 这是我的代码。 警告说:“函数调用参数是一个未初始化的值”
3回复

C指针转换

假设我有一个字节缓冲区: 我想要做的是从特定偏移量中获取qword。 偏移量将以字节计算。 这是我做的: 它似乎对我有用。 我从头开始跳过16个字节,然后占用8个字节。 我的问题是为什么我收到此警告消息:
2回复

用C转换指针类型

问题是–为什么我double_ptr使用此代码分配double_ptr ,因为它会导致分段错误,但对于整数可以正常使用? 据我了解,char是1字节长,int是4字节长,所以double是8字节长。 通过使用表达式*(double *)&c我期望以下内容: &–获取c的内存
2回复

C指针转换-奇怪的结果

考虑这个简短的代码: 我认为将 s 转换为 char* 将允许我逐字节遍历数组,产生输出 但是我得到了这个: 有人可以向我解释一下吗? 我在 x64 上运行 gcc 4.8.1。
2回复

用C转换指针

有人可以解释一下这两行是什么意思吗? 我认为我们只能在等号之前使用int* 。 但是怎么可能用short*来投射一个数字呢? 如果这是一个愚蠢的问题,我很抱歉。 我刚开始用 C 编码,所以我很困惑。 你能解释一下指针是如何在 C 中转换的吗?