我的结构通常包含指向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
)
简而言之:如何获得使用*
(指针)和**
(指针指针)的值?
答案 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;
}