C ++(指针)指针的概念问题

时间:2010-05-02 20:18:27

标签: c++ pointers

我的结构通常包含指向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;

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

  • 问题:设置后我无法更改引用,对吧?或者有办法吗?

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

3 个答案:

答案 0 :(得分:2)

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;

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

我们很少在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;
}