通过数组迭代的指针初始化

时间:2015-02-07 01:08:21

标签: c pointers void-pointers

我有一个函数,我有2个void指针(规范的一部分),但我知道它们是char *。我想遍历char数组,所以我尝试创建一些指针来迭代它们。当我执行以下操作时,我的程序不起作用:

int foo(void const * first, void const * second)
{
    char const * firstIt = (const char*) first;
    char const * secondIt = (const char*) second;
    ...
}

但是,如果我这样做:

int foo(void const * first, void const * second)
{
    char const * firstIt = *(const char**) first;
    char const * secondIt = *(const char**) second;
    ...
}

两者有什么区别,为什么第二个有效?我不知道是否包含足够的细节,所以如果需要更多信息,我很乐意提供它。

2 个答案:

答案 0 :(得分:1)

如果第二个工作,这是因为你为函数指定的void指针实际上可以是任何东西,我猜你正在向函数传递指针的指针。例如,以下代码有效:

#include <stdio.h>
#include <stdlib.h>

int foo(void const * first, void const * second);
int goo(void const * first, void const * second);

int main () {
    char * a, * b;

    a = malloc (sizeof (char));
    b = malloc (sizeof (char));

    *a = 'z';
    *b = 'x';

    goo (&a, &b); /* critical line */

    free (a);
    free (b);

    return 0;
}

int foo(void const * first, void const * second) {
    char const * firstIt  = (const char*) first;
    char const * secondIt = (const char*) second;    
    printf ("%c %c", *firstIt, *secondIt);
    return 1;
}

int goo(void const * first, void const * second) {
    char const * firstIt = *(const char**) first;
    char const * secondIt = *(const char**) second;
    printf ("%c %c", *firstIt, *secondIt);
    return 2;
}

但是,要使上述程序使用函数foo,您需要使用以下形式的调用替换关键行:

foo (a, b);

区别是否有意义?它解决了你的问题吗?

答案 1 :(得分:1)

第一种方法假设调用者已经传递了char *(const以某种方式限定)。

第二个假定调用者已经传递了char **(const以某种方式限定)。

如果第二个有效,那就意味着你的来电者正在传递一个字符**。

第一个不起作用的原因是未定义的行为。具有一种类型的指针,转换为另一种类型,并将其解除引用为原始类型以外的任何类型都会产生未定义的行为。通过void指针进行往返不会改变它。

这就是为什么编译器抱怨将一个指针类型隐式转换为另一个指针类型(除了与void指针之外)。