将short * / double *转换为int *并返回和取消引用

时间:2014-11-30 19:08:19

标签: c++

因为我对C ++很陌生并且还需要学习很多东西,请耐心等待,也许还有一些愚蠢的问题:

基本上,我声明了一个map<wstring, int*>,因为我要取消引用和使用的大多数变量是int s(4个字节)。不幸的是,有罕见的是double s(8字节)或short s(2字节),我对此没有任何影响。为了简单起见,我想学习一些东西,我想阅读所有指向同一地图的指针。以下是我的想法:

map[wstring] = (int*) short*;//or double*

上述工作是否只是将short或double的内存地址的开头存储在地图而不是存储器的实际内容中?

据我所知,哪些键不同,我会在解除引用之前将指针强制转换回它们的类型:

short = *((short*) map[wstring]); // or double = *((double*) map[wstring]);

从我有限的知识来看,这可能有用。我会说,虽然从存储的内存地址通常会读取4个字节,因为这是地图声明的内容,现在,通过强制转换为short *或double *,我说我想要从存储地址的开头读取2或8个字节。事实上,它确实起到了至少与短裤的作用,但我不确定这是否只是巧合,我需要确定。

再次,如果这完全是胡说八道,我很抱歉,并提前感谢提高思维能力。

2 个答案:

答案 0 :(得分:3)

如果您想要存储指向某些任意数据的指针,那么最简单的事情之一可能是标记的联合,如Boost.Variant

typedef boost::variant<
    int*,
    double*,
    short*
> SomePtr;

std::map<wstring, SomePtr> m;

通过这种方式,您可以安全地存储任何指针类型 ,并使用variant类型提供的各种功能来获取值(例如boost::apply_visitor())。现在我不确定存储指针是否是一个要求,但如果你将其用作variant<int, double, short>,这也是有效的。

或者,如果您不想使用Boost,您可以使用union和索引编写自己的此变体版本:

class Variant {
    union {
        int* iptr;
        double* dptr;
        short* sptr;
    };
    int which;

public:
    Variant(int* p): iptr(p), which(0) { }
    Variant(double* p): dptr(p), which(1) { }
    Variant(short* p): sptr(p), which(2) { }

    // example
    template <typename F>
    void visit(F f) {
        switch (which) {
            case 0: f(iptr); break;
            case 1: f(dptr); break;
            case 2: f(sptr); break;
        }
    }
};

std::map<wstring, Variant> m;

答案 1 :(得分:0)

即使必须通过void指针,也始终可以将指针强制转换为指向其他类型的指针。但是在解除引用时,你会得到垃圾,因为你会错误地解释一个内存区。

如果你有一些魔法来了解实际上short *double *的指针,你肯定可以做到。这是一个例子:

#include<iostream>

using namespace std;

int main()
{
    double b = 0.5;
    short h = 10;
    int i = 5;
    int *t[3] = { (int *) &b, (int *)&h, &i };
    cout << *((double *) (t[0])) << " " << *((short *) (t[1])) << " " << *(t[2]) << endl;
    return 0;
}

给出:

0.5 10 5

我的建议是:

  • 除非你有充分理由这样做,否则不要使用
  • 从不在实际应用中使用它