例如,将char* str
传递给采用void *ptr
我意识到为了通过这个,我需要传递:
fnc(&str)
一旦进入fnc(void *ptr)
函数,我需要取消引用才能使用它
fnc(void *ptr){
*(char **)ptr = other string
}
我通过反复试验了解到这一点,但从未理解为什么会发生这种情况
*
外面是什么意思?内部2 *
怎么样(char __)?
修改
例如,回调函数将str1作为“& str”传递,将str2作为“第一个元素为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。
除了在回调函数上创建相似性之外,lfind将第一个参数作为& str传递的原因仍然是我未知的(两个解引用char **而不是一个cast和一个dereference)。我从Jonathan的回答中假设这一点,他提到没有必要在函数内部使用*(char **)ptr。
再次感谢大家的帮助。抱歉相对愚蠢的问题。
答案 0 :(得分:0)
也许你应该阅读一本介绍指针概念的C书。你似乎有点朦胧。
然后你必须void *
作为指针指向任何内存位置,但没有该位置包含的类型信息。
当你想使用那个位置时,你必须通过强制转换为适当类型的指针告诉编译器void指针指向的类型。