【发布时间】:2016-10-13 03:27:23
【问题描述】:
我在读一本 C 书。但听不懂的句子是
如果调用calloc成功,则返回指向内存中数组基址的void*指针;
这里,如果void*类型的指针指向内存中数组的基数,那么array[0]的类型是void??
我想知道是什么意思...
谢谢大家阅读我的问题,希望得到答案!
【问题讨论】:
-
在写入
[0]之前,您可以将void *转换为其他指针类型
我在读一本 C 书。但听不懂的句子是
如果调用calloc成功,则返回指向内存中数组基址的void*指针;
这里,如果void*类型的指针指向内存中数组的基数,那么array[0]的类型是void??
我想知道是什么意思...
谢谢大家阅读我的问题,希望得到答案!
【问题讨论】:
[0] 之前,您可以将 void * 转换为其他指针类型
我知道既然int * 指向int,那么void * 应该指向void 是多么诱人。但事实并非如此。 void * 和 void 之间确实没有有用的关系,因此最好将它们视为单独的概念。
void * 在 C 中表示指向未指定类型对象的指针。如果您熟悉它,可以将其视为 Java Object 的 C 类似物。
void * 具有以下属性:
任何指针类型都可以与void *相互转换,即void *足以容纳任何指针,即使在指向不同类型的指针可以具有不同大小的机器上也是如此。
void * 和其他指针类型之间的转换是隐式的,您不必进行显式转换。
不允许取消引用void *,即我们必须在访问它指向的内存之前将其转换为具体的指针类型。
您不能在标准 C 中对 void * 进行地址运算,尽管 GCC 允许您将其作为文档化扩展来执行。
void * 是需要处理任意数据的函数的选择类型,例如 calloc()。
【讨论】:
calloc 返回void* 因为:
calloc 可用于为任何类型的对象分配内存。void* 可以隐式转换为其他指针类型。如果你使用:
void* ptr = calloc(...);
它是有效的,但你不能使用*ptr。 void* 不可取消引用 必须将指针转换为其他类型才能取消引用。例如
char* cptr = ptr;
*cptr = 'a';
【讨论】: