我对指针短语的确切含义有疑问。
我有以下方法:
myFunc(const void * p)
{
...
}
它被调用:
myStruct *st;
...
myFunc((char **)&st->arr);
我有使用指针的经验,但在这种情况下,我仍然迷失在所有这些指针和强制转换中。我能否准确解释一下这种情况是如何工作的?
谢谢
这似乎是质量差的代码!可能并不危险,如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);
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”中)代码。
您正在使用双指针char **调用方法 myFunc ,并且使用const void *ptr捕获的方法相同。在 C 中,void 指针可以保存其他指针类型,例如 (char */float */int */...),稍后我们可以在使用时对它们进行类型转换。
因此,这里的 void 指针可以保存一个双字符指针,您可以稍后将 void 指针类型转换为双字符指针,例如
char **tempPtr = (char **)p;
这里 const 限定符使指针 p 成为一个常量数据指针,这意味着在函数内部它不会改变它指向的数据。