请解释 C 中的空指针

Please explain void pointers in C

例如将 char* str 传递给接受 void *ptr

的函数

我意识到为了通过这个我需要通过:

 fnc(&str)

一旦进入 fnc(void *ptr) 函数,我需要取消引用才能使用它

 fnc(void *ptr){
    *(char **)ptr = other string
 }

我通过反复试验了解到这一点,但从未真正理解为什么会发生这种情况

外面的*是什么意思? (char __)里面的2*怎么样?

编辑:

例如回调函数将 str1 作为“&str”传递,将 str2 作为 "an address to an array whose first element is a char*"

lfind(&str, arr, ...., cmp);

进入

int cmp_str_ptr(const void *str1, const void *str2){

    return strcmp(*(char **)str1, *(char **)str2);

 }

不过我真正想知道的是 * 在每个间接级别上的含义。 *(char *)str1 vs *(char **)str1 vs *(char)str1 如果最后一个有效甚至与 *(char *)&str1.

的组合

括号外的 * 与括号内的 * 是什么意思。不管使用的是什么函数,我都想知道这些是什么意思。

最终编辑:

感谢 Mike 帮助我解决了这个问题,我现在意识到真正的问题出在类型转换上,而不一定是在一般的指针上。我看过K&R的c编程语言,但直到现在我才明白。

总而言之,我问的是为什么 strcmp 需要 *(char **)str1 作为值,在 Mike 的回答后我看到它被转换为指向 char* 的指针,因此需要取消引用它至于遵循 strcmp(char *s1, char *s2) reqs.

除了在回调函数上创建相似性(对 char ** 的两次取消引用而不是一次转换和一次取消引用)之外,lfind 将第一个参数作为 &str 传递的原因对我来说仍然有点未知。我从 Jonathan 的回答中假设了这一点,他提到没有必要在函数内部使用 *(char **)ptr。

再次感谢大家的帮助。很抱歉这个相对愚蠢的问题。

也许您应该阅读一本解释指针概念的介绍性 C 书籍。你好像有点糊涂了。

那么你必须 void * 作为一个指针,它可以指向任何内存位置,但没有该位置包含的内容的类型信息。

当您想使用该位置时,您必须通过转换为适当类型的指针来告诉编译器 void 指针指向什么类型。