gpt4 book ai didi

c - 为了转换指针数组(例如 *array[]),为什么使用 (void**) 而不是 (void*)

转载 作者:太空宇宙 更新时间:2023-11-03 23:25:50 26 4
gpt4 key购买 nike

以下代码片段来自 K&R 第 5-11 章:指向函数的指针:

qsort((void**) lineptr, 0, nlines-1, 
(int (*)(void *, void *)(numeric ? numcmp : strcmp));

我可以使用 (void*) 编译/运行代码,那么为什么要用 (void **) 来转换 lineptr 呢?两个类型转换之间是否存在任何内部差异,还是更利于可读性? (void *) 是否只转换数组,而 (void **) 正在转换数组和存储的指针?

我理解 **lineptr 等同于 *lineptr[] 并且 void cast 的原因是为了让编译器满意。

最佳答案

这很可能是不正确的。

void* 是指向某物的指针。我们不知道它指向什么。您可以将任何指针转换为 void*。您传递给 qsort 的比较函数必须猜测 void* 指向的实际类型。如果它做对了,那很好。如果它弄错了,事情就会出错——这是生活和程序员的责任。

void** 是指向 void* 数组的指针。这里有一个很大的区别:虽然您可以毫无问题地将 int* 转换为 void*,但 int* 数组绝对不是void* 数组。 int* 和 void* 可以有不同的大小! C 标准非常清楚哪些类型的指针具有相同的表示形式:

  1. void* 和 char* 的任何变体(void** 不是 void* 的变体)
  2. 任何指向结构的指针
  3. 任何指向 union 的指针
  4. 指向不同符号的原始类型(如 int、unsigned int)的任何指针。

任何不在同一组中的指针都可以有不同的表示,因此强制转换可能会起作用,但 memcpy 或通过指向不同指针类型的指针读取值不起作用。

关于c - 为了转换指针数组(例如 *array[]),为什么使用 (void**) 而不是 (void*),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27661807/

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