关于指针使用的澄清

时间:2013-07-15 08:15:49

标签: c pointers

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

我有以下方法:

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

它被称为:

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

我有使用指针的经验,但在这种情况下,我仍然迷失所有这些指针和铸造.. 我可以得到关于这个案例如何运作的准确解释吗?

由于

3 个答案:

答案 0 :(得分:1)

这接缝是质量差的代码!也许并不危险,因为const出现在原型中。

myFunc(const void * p)接受指向任何内容的指针,const表示不会触及它。

现在,st是指向myStruct的指针,因此st->arrarr成员的值,&st->arrarr的内存地址会员假设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成为一个常量数据指针,这意味着在函数内部它不会改变它指向的数据。