为什么 memchr() 将 void 指针作为输入?
Why does memchr() take a void pointer as input?
我目前正在重新编写一些 C 库。所以我的问题是:为什么 memchr
采用 const void *s
指针而不是简单的字符指针?
我知道你可能会搜索其他东西,但该函数的字面意思是 memchr 那么为什么要使用空指针?
提前致谢!
这与在 string.h
中声明的其他函数使用 void*
: 以避免强制转换的原因相同。
也许您是对的,这个名称具有误导性,尤其是考虑到它是 string.h
的一部分。话又说回来,memmove
、memcmp
、memset
等...
C 的早期开发涉及大量将事物视为单独的字节并允许程序员访问表示对象的字节。 memchr
这个名字反映了那段历史,现在不能轻易更改。
void
被添加到语言中以提供一种类型,从某种意义上说,“有些东西在那里,但这是灵活的。” memchr
的第一个参数具有 const void *
类型,因为该例程可用于在任何类型的对象中搜索字节,而不一定是主要为字符数组的对象。
在 1989 年标准 (-std=c89
) 中引入 void
数据类型之前,像 memchr()
这样的函数曾经采用 const char *
,因为那是最接近的东西指向当时的通用指针。
如果今天有 const char *
,您需要从 x *
转换为 const char *
。
你也可以打个比方:
strcpy()
-> 字符串复制
memcpy()
-> 内存(二进制)拷贝
我目前正在重新编写一些 C 库。所以我的问题是:为什么 memchr
采用 const void *s
指针而不是简单的字符指针?
我知道你可能会搜索其他东西,但该函数的字面意思是 memchr 那么为什么要使用空指针?
提前致谢!
这与在 string.h
中声明的其他函数使用 void*
: 以避免强制转换的原因相同。
也许您是对的,这个名称具有误导性,尤其是考虑到它是 string.h
的一部分。话又说回来,memmove
、memcmp
、memset
等...
C 的早期开发涉及大量将事物视为单独的字节并允许程序员访问表示对象的字节。 memchr
这个名字反映了那段历史,现在不能轻易更改。
void
被添加到语言中以提供一种类型,从某种意义上说,“有些东西在那里,但这是灵活的。” memchr
的第一个参数具有 const void *
类型,因为该例程可用于在任何类型的对象中搜索字节,而不一定是主要为字符数组的对象。
在 1989 年标准 (-std=c89
) 中引入 void
数据类型之前,像 memchr()
这样的函数曾经采用 const char *
,因为那是最接近的东西指向当时的通用指针。
如果今天有 const char *
,您需要从 x *
转换为 const char *
。
你也可以打个比方:
strcpy()
-> 字符串复制memcpy()
-> 内存(二进制)拷贝