gpt4 book ai didi

c - void* 是什么意思以及如何使用它?

转载 作者:太空狗 更新时间:2023-10-29 16:14:30 24 4
gpt4 key购买 nike

今天在看别人的代码时,看到了类似void *func(void* i);的东西,这个void*对函数来说是什么意思名称和变量类型分别是?

另外,我们什么时候需要用到这种指针,怎么用呢?

最佳答案

指向void 的指针是一种“通用”指针类型。 void * 无需显式转换即可转换为任何其他指针类型。您不能取消引用 void * 或用它做指针运算;您必须先将其转换为指向完整数据类型的指针。

void * 通常用于需要在同一代码中使用不同指针类型的地方。一个经常被引用的例子是库函数 qsort:

void qsort(void *base, size_t nmemb, size_t size, 
int (*compar)(const void *, const void *));

base是数组的地址,nmemb是数组中元素的个数,size是每个元素的大小, compar 是指向比较数组的两个元素的函数的指针。它被这样调用:

int iArr[10];
double dArr[30];
long lArr[50];
...
qsort(iArr, sizeof iArr/sizeof iArr[0], sizeof iArr[0], compareInt);
qsort(dArr, sizeof dArr/sizeof dArr[0], sizeof dArr[0], compareDouble);
qsort(lArr, sizeof lArr/sizeof lArr[0], sizeof lArr[0], compareLong);

数组表达式iArrdArrlArr在函数调用中从数组类型隐式转换为指针类型,每一个都是从“指向 int/double/long 的指针”隐式转换为“指向 void 的指针”。

比较函数看起来像这样:

int compareInt(const void *lhs, const void *rhs)
{
const int *x = lhs; // convert void * to int * by assignment
const int *y = rhs;

if (*x > *y) return 1;
if (*x == *y) return 0;
return -1;
}

通过接受 void *qsort 可以处理任何类型的数组。

使用 void * 的缺点是您将类型安全抛到了窗外,并进入了迎面而来的交通中。没有什么可以防止您使用错误的比较例程:

qsort(dArr, sizeof dArr/sizeof dArr[0], sizeof dArr[0], compareInt);

compareInt 期望其参数指向 int,但实际上是在使用 double。没有办法在编译时发现这个问题;你只会得到一个错误排序的数组。

关于c - void* 是什么意思以及如何使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11626786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com