Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当char*已经存在时,为什么void*是必需的?_C - Fatal编程技术网

当char*已经存在时,为什么void*是必需的?

当char*已经存在时,为什么void*是必需的?,c,C,char*,作为原始的通用指针,它的工作做得很好。我知道,void*只能做char*。此外,该标准还支持使用void*执行算术,这有点容易出错 那么为什么我们需要在C中键入一个void*?我们应该什么时候使用它,而不是char* void*只能做char* 我不确定哪一个能比另一个做更多的事情,但我确定void*能做他自己的工作,而char*(或任何其他类型的指针)不能 void*被称为通用指针。通用指针: 可以保存任何类型的对象指针 不能取消引用 当您希望指针在不同时间指向不同类型的数据时,

char*
,作为原始的通用指针,它的工作做得很好。我知道,
void*
只能做
char*
。此外,该标准还支持使用
void*
执行算术,这有点容易出错

那么为什么我们需要在C中键入一个
void*
?我们应该什么时候使用它,而不是
char*

void*
只能做
char*

我不确定哪一个能比另一个做更多的事情,但我确定
void*
能做他自己的工作,而
char*
(或任何其他类型的指针)不能

void*
被称为通用指针。通用指针:

  • 可以保存任何类型的对象指针
  • 不能取消引用
  • 当您希望指针在不同时间指向不同类型的数据时,这一点特别有用
如果你试图让
char*
做一些
void*
可以做的事情,这可能会导致假设

如果即使编译器也没有通知不兼容类型的错误或至少警告,我们仍然不希望看到这种代码:

//hi guys, the argument is char* type 
//but you still can pass any other pointer types 
//don't worry!
void func(char * p) {
    ...
}
我们只需要这个:

//this comment is not need, right?
//you know that you can pass any pointer types
void func(void* p) {
    ...
}

对于隐式变换和泛型对象类型?ie psuedo面向对象C Stuff您无法取消对
void*
的引用,因此它会阻止您做一些愚蠢的事情。
char*
对指向的内容做了很多假设。这些假设倾向于与当今大多数人对记忆的看法相吻合,但这并不能使这些看法具有普遍性
void*
不做这样的假设。
使用void*进行算术不受标准支持,这有点容易出错
相反,它在编译时捕获了可能在运行时爆炸的虚假算术。投票重新打开,我不认为这是一个基于意见的问题“通用指针可以容纳任何类型的指针”:标准C禁止在函数指针和
void*
之间赋值。因此更准确地说,“通用指针可以容纳任何类型的对象指针”。