更新指向void指针的指针

时间:2016-03-26 22:09:28

标签: c pointers void

我有一个带有以下签名的函数:

array.sort.each_cons(2) { |x, y| puts(x) if x == y }

主要功能是这样的:

int func(void **ptr);

int main() { void *ptr = 0; func((void **)&ptr)); ... } 内{我}更新func

ptr

但是,当我尝试在*ptr = someAddress; 中使用ptr时,它包含值0(这意味着它尚未更新)。它让我觉得好像指针是通过值传递的,但是这是怎么回事?因为我将地址传递给main

2 个答案:

答案 0 :(得分:1)

如上所述,似乎对我很好:

int thing = 13;
void *someAddress = &thing;

int func(void **ptr) {
    *ptr = someAddress;

    return (*((int *)someAddress) * *((int *)someAddress));
}

int main() {
    void *ptr = 0;

    int x = func(&ptr);

    printf("%p -> %d; square = %d\n", ptr, *((int *)ptr), x);

    return 0;
}

打印出新指针值及其指向的内容:

0x108410018 -> 13; square = 169

答案 1 :(得分:0)

您似乎对使用void指针和void指针可以表示的内容感到困惑。 void指针可以表示任何指针(例如char **p = NULL; void *vp = p;,它也可以是char ***p)。不要求您将原始指针的间接级别与其void表示相匹配。重要的是当你使用时你如何处理void指针。例如,您可以轻松编写func

int func (void *ptr)
{
    void **p = ptr;
    *p = &STR;
    return (int)strlen (*p);
}

您在ptr中传递地址字符串的位置。例如,这段短代码(我猜一点)似乎完成了你想要完成的任务:

#include <stdio.h>
#include <string.h>

#define STR "some string."

int func (void *ptr);

int main (void) {

    char *p = NULL;

    printf (" length : %d\n", func (&p));
    printf (" string : %s\n", p);

    return 0;
}

int func (void *ptr)
{
    char **p = ptr;
    *p = (char *)&STR;
    return (int)strlen (*p);
}

<强>输出

$ ./bin/voidptr
 length : 12
 string : some string.

如上所示,char **p中的main作为void *传递给func,但重要的考虑因素是使用ptr func。要将ptr视为void **,您必须在func中通过第二个指针void **将其用作p。正如评论中指出的那样,最好将p声明为char **

仔细看看,让我知道我是否正确猜到了你的尝试,以及是否还有其他问题。