【问题标题】:C++ Conceptual problem with (Pointer) Pointers(指针)指针的 C++ 概念问题
【发布时间】:2010-05-02 20:18:26
【问题描述】:

我有一个结构通常包含一个指向int 的指针。但是,在某些特殊情况下,这个 int 指针必须指向另一个指针,然后该指针又指向一个 int。哇:到目前为止,我提到了5次指针这个词!

  • 这可能吗?

我是这样想的:与其使用第二个 int 指针,这很可能是不可能的,因为我的主 int 指针只能指向一个 int 而不能指向另一个 int 指针,我可以将它作为这样的引用:

int intA = 1;
int intB = 2;
int& intC = intB;

int* myPointers[ 123 ];
myPointers[ 0 ] = &intA;
myPointers[ 1 ] = &intB;
myPointers[ 3 ] = &intC;

所以上面会做我想要的:对intB (intC) 的引用就像我想要的一样(如果它被改变,它也会改变intB

  • 问题:一旦设置引用,我就无法更改引用,对吧?或者有什么办法?

简而言之:如何获得与*(指针)和**(指向指针的指针)一起使用的值?

【问题讨论】:

  • 如果您退回到what,而不是how,您可能会得到更好的建议。
  • 是的,@gf 说的。你想要的可以通过几个演员来完成,但答案真的取决于上下文,取决于你要解决的问题。

标签: c++ pointers


【解决方案1】:

int*int** 是不同的类型,因此如果不使用潜在的不可移植演员表,就不能将其中一种用作另一种。

在声明中:

int& intC = intB;

引用 intC 将始终引用 int intB。绑定无法更改。

您可以使用联合来支持int*int** 的类型,但您需要在阅读时确定联合的哪个成员在任何时候都有效。

union PIntOrPPInt
{
    int* pint;
    int** ppint;
};

int intA;
int intB;
int* pintC = &intB;

PIntOrPPInt myPointers[ 123 ];

myPointers[ 0 ].pint = &intA;
myPointers[ 1 ].pint = &intB;
myPointers[ 3 ].ppint = &pintC;

【讨论】:

  • 你是什么意思?如果你想存储可能是两种类型之一的东西,那么你需要一种可以支持它的类型。 union 可能是最简单的此类类型。
  • @Ptr:我想你可以有一个void* 的数组,并根据需要使用reinterpret_cast 转换为正确的类型。不过,我认为这与 union 解决方案相比没有任何优势。
【解决方案2】:

您可以在两个数组元素中放置一个指向 intB 的指针:

myPointers[ 1 ] = &intB;
myPointers[ 3 ] = &intB;

这样两个元素都指向同一个变量,*myPointers[1] 将始终与*myPointers[3] 相同。这是你想要达到的目标吗?

【讨论】:

  • 并非如此:我需要一个与 int* 类型“兼容”但指向 myPointers 元素的变量。基本上:一个存储在 myPointers 中的值,它可以更改它的目标,并且它自己会再次指向 myPointers 中的一个变量。
【解决方案3】:

我们很少在 C++ 中使用指向指针的指针。相反,就像您建议的那样,我们使用对指针的引用。也就是说,C++ 是一种强类型、静态类型的语言。所以你必须在编译时决定你的数组元素将指向什么。

一种方法是将数组元素包装在一个类中:

struct P {
    P() : p(0) { }
    P(int* p) : p(p) { }
    P(int** p) : p(*p) { }
    operator int*() const { return p; }
    int *p;
};

int main(int argc, char* argv[])
{
    int *i1 = new int(5);
    int **i2 = &i1;
    int *&i3 = i1;
    P arr[4] = {i1, i2, i3, P()};
    delete i1;
    return 0;
}

【讨论】:

    猜你喜欢
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多