0

以下 C++ Win32 控制台程序将数组分配给指向 void 的指针,并以两​​种不同的方式打印结果:

// Foo.cpp : A Win32 console application.
//
#include "stdafx.h"

typedef unsigned char elem_type;
#define ELEM_COUNT 4

int _tmain(int argc, _TCHAR* argv[])
{
    elem_type *ary = new elem_type[ELEM_COUNT];
    for (int i = 0; i < ELEM_COUNT; i++)
    {
        ary[i] = ((i + 1) * 5); // multiples of 5
    }
    void *void_ary = ary;

    for (int i = 0; i < ELEM_COUNT; i++)
    {
        printf("void_ary[%d] is %u\t", i, ((elem_type*)void_ary)[i]);
        printf("*(void_ary+%d) is %u\n", i, *((elem_type*)(void_ary))+i);
    }

    void *allocd_ary;
    return 0;
}

这是输出:

void_ary[0] is 5        *(void_ary+0) is 5
void_ary[1] is 10       *(void_ary+1) is 6
void_ary[2] is 15       *(void_ary+2) is 7
void_ary[3] is 20       *(void_ary+3) is 8

使用方括号会打印出我预期的结果。但是取消引用指针偏移量不会,即使数组正在被 typecast

为什么会出现差异?

4

3 回答 3

3

那是因为您要取消引用该值,然后将“i”添加到结果中。您需要在指针强制转换或使用更明显的 static_cast 周围加上更多括号。

如:

*(static_cast<elem_type*>(void_ary)+i)

于 2012-04-05T18:04:08.140 回答
1
printf("*(void_ary+%d) is %u\n", i, *((elem_type*)(void_ary))+i);

在这里,您似乎在添加之前取消引用该值i。这将导致始终获取数组的第一个元素(因为您取消引用相同的指针 5 次)并添加i到它。

尝试:

*((elem_type*)(void_ary)+i)
于 2012-04-05T18:05:43.407 回答
1

你的表达不是同一个意思。你写的是什么

*(void_ary+i)

其实不是这样的。事实上它是

void_ary[0]+i

根据你的printf符号。


如果你写

*((elem_type*)(void_ary))+i

作为

*((elem_type*)(void_ary)) + i

然后我认为它变得更加清晰。您正在寻找:

*((elem_type*)(void_ary)+i)
于 2012-04-05T18:06:33.613 回答