我对指针短语的确切含义有疑问。
我有以下方法:
myFunc(const void * p)
{
...
}
它被称为:
myStruct *st;
...
myFunc((char **)&st->arr);
我有使用指针的经验,但在这种情况下,我仍然迷失所有这些指针和铸造.. 我可以得到关于这个案例如何运作的准确解释吗?
由于
答案 0 :(得分:1)
这接缝是质量差的代码!也许并不危险,因为const
出现在原型中。
myFunc(const void * p)
接受指向任何内容的指针,const
表示不会触及它。
现在,st
是指向myStruct
的指针,因此st->arr
是arr
成员的值,&st->arr
是arr
的内存地址会员假设arr
是一个数组,st->arr
值已经是指针。
因此,(char**)
可能是&st->arr
的正确类型,它是指向字符数组的指针。如果它是正确的类型,则无需投射!
当您需要告诉编译器将数据作为另一个数据处理时,您可以进行转换。这有意义,在这种情况下myFunc((const void *)&st->arr);
无论如何,如果没有关于myFunc的更多信息,我相信真正的程序员意图是myFunc((const void *) st->arr);
答案 1 :(得分:0)
st-> arr的地址被转换为char **(即找到指向char的指针的地址)。 myFunc几乎接受任何东西(void *),你必须小心地传递它知道如何处理的东西。
在内部,myFunc可以执行以下操作:
struct myStruct{
char* arr;
};
void myFunc(const void* ptr){
char** cPtr = (char**) ptr;
(*cPtr)[1] = ...;
}
int main()
{
struct myStruct s;
...
myFunc((char **)&s.arr);
...
}
但是,你应该注意到这是非常糟糕的(如“dangerouse”)代码。
答案 2 :(得分:0)
您正在使用双指针 char ** 调用方法myFunc,并且您正在使用 const void * ptr 进行调用。在C中,void指针可以保存其他指针类型,如(char * / float * / int * / ...),稍后我们可以在使用时对它们进行类型转换。
所以这里一个void指针可以保存一个双字符指针,你可以稍后将void指针强制转换为双字符指针,如
char **tempPtr = (char **)p;
这里const限定符使指针p成为一个常量数据指针,这意味着在函数内部它不会改变它指向的数据。