首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对于一个指针数组(例如*array[]),为什么使用(void**)而不是(void*)

对于一个指针数组(例如*array[]),为什么使用(void**)而不是(void*)
EN

Stack Overflow用户
提问于 2014-12-26 20:46:37
回答 1查看 95关注 0票数 2

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

代码语言:javascript
运行
复制
qsort((void**) lineptr, 0, nlines-1, 
   (int (*)(void *, void *)(numeric ? numcmp : strcmp));

我能够用(void*)编译/运行代码,那么为什么lineptr使用(void **)进行强制转换呢?这两种类型之间是否有任何内部差异,还是更容易阅读?(void *)转换只是数组,而(void **)是同时转换数组和存储指针吗?

据我所知,**lineptr等同于*lineptr[],而产生void的原因是为了让编译器高兴。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-26 20:58:01

很可能是不正确的。

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

空**是指向空*数组的指针。这里有一个很大的区别:例如,您可以将int*转换为void*,但是int*数组绝对不是一个void*数组。int*和void*可以有不同的大小!C标准非常清楚地说明了哪种指针具有相同的表示形式:

  1. 对void*和char*的任何更改(void**不是对void*的更改)
  2. 任何指向结构的指针
  3. 任何关于工会的指示
  4. 指向不同符号类型的原始类型的任何指针(如int、unsigned int)。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27661807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档