-5

我对指针短语的确切含义有疑问。

我有以下方法:

myFunc(const void * p)
{
  ...
}

它被调用:

myStruct *st;
...
myFunc((char **)&st->arr);

我有使用指针的经验,但在这种情况下,我仍然迷失在所有这些指针和强制转换中。我能否准确解释一下这种情况是如何工作的?

谢谢

4

3 回答 3

1

这似乎是质量差的代码!可能并不危险,如const原型中所示。

myFunc(const void * p)接受指向任何东西的指针,并且const应该意味着它不会触及它。

现在,st是指向 的指针,成员的值也是myStruct如此,成员的内存地址也是如此。假设是一个数组,值已经是一个指针。st->arrarr&st->arrarrarrst->arr

所以,(char**)可能是正确的类型&st->arr,它是一个指向字符数组的指针。如果它是正确的类型,则无需强制转换!

当您需要告诉编译器将您的数据作为另一个数据处理时,您进行转换。这是有道理的,在这种情况下myFunc((const void *)&st->arr);

无论如何,如果没有关于 myFunc 的更多信息,我相信真正的程序员意图是myFunc((const void *) st->arr);

于 2013-07-15T09:07:42.517 回答
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”中)代码。

于 2013-07-15T08:18:18.340 回答
0

您正在使用双指针char **调用方法 myFunc ,并且使用const void *ptr捕获的方法相同。在 C 中,void 指针可以保存其他指针类型,例如 (char */float */int */...),稍后我们可以在使用时对它们进行类型转换。

因此,这里的 void 指针可以保存一个双字符指针,您可以稍后将 void 指针类型转换为双字符指针,例如

    char **tempPtr = (char **)p;

这里 const 限定符使指针 p 成为一个常量数据指针,这意味着在函数内部它不会改变它指向的数据。

于 2013-07-15T09:38:23.073 回答