为什么calloc指针类型是void *?
我读了一本C书。 但是不能理解那句话
如果调用calloc成功,则返回指向内存中数组基类的void *类型的指针;
这里,如果指向类型为void *的指针指向内存中数组的基数,那么array [0]的类型为void?
我想知道什么意思……
谢谢大家阅读我的问题,希望得到答复!
我可以看出它是多么诱人,因为int *
指向int
,那么void *
应该指向void
。 但事实并非如此。 void *
和void
之间确实没有任何有用的关系,因此最好将它们视为单独的概念。
void *
in 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';