对不起,必须在某个地方回答此问题,但我没有找到。

我有一个代码:

const int * tableCards[9];
int hand1card1 = 0;
tableCards[0] = & hand1card1;
int hand1card2 = 1;
tableCards[1] = & hand1card2;
int * flop1 = & tableCard[0];
tableCards[2] = flop1;
cout << * flop1 << endl;
cout << * tableCards[2] << endl;
flop1++;
cout << * flop1 << endl;
cout << * tableCards[2] << endl;

tableCard[48] is an array of pointers to ints


该代码有效,但是我想更改tableCards[2] = flop1;行以使* tableCards[2]返回由* flop1指向的元素的实际值。在此代码中,* flop1返回我想要的值,但是* floppy [card2]在增加flop1之后保持不变。

我以为tableCards[2] = & (* flop1);会将* flop1指向的值的地址分配给int指针tableCards [2],但是在增加flop1之后,tableCards [2]的值保持不变。我不想在指针上使用指针数组而不是指针数组,因为所需的4/9值只是整数,而不是整数上的指针。

编辑:请注意tableCards [9]与tableCard [48]不同。很抱歉,当我看到评论和答案时,这个问题一定会令人困惑。

最佳答案

这不应该编译:

int * flop1 = & tableCard[0];


tableCard[0]的类型是int*,因此当您使用&引用它时,它会变成int**。您正在将其分配给int*。至少它应该生成一个编译器警告。

因此,flop1指向地址tableCard[0]*flop1为您提供存储在tableCard[0]处的值(指针),而**flop1为您提供tableCard[0]所指向的值。但是,由于您为flop1提供了错误的类型(int*而不是int**),所以您不能这样做。

我将此基于您提出的具有另一个数组的注释:

int * tableCard[48];


我认为您的意思是:

int * flop1 = tableCard[0];
tableCards[2] = flop1;


现在,当您增加flop1时,它只会更改指针。 tableCards[2]处的指针仍将指向与tableCard[0]所指向的值相同的值。

但是这很顽皮:

flop1++;
cout << * flop1 << endl;


flop1是存储在tableCard[0]处的指针。当您增加它然后使用它时,您将其视为一个数组。也许是吗?但是可能不是。您不知道flop1现在指向什么内存。

[编辑]在考虑了这段代码可能要实现的目标之后...

因此,的确如此,如果您期望flop1现在指向第二个数组元素,则需要使用双指针(int**)。这意味着flop1现在是tableCard数组中的迭代器,而不是元素...因此,当您对其进行递增时,它现在指向存储在tableCard[1]处的指针,而tableCards[2]仍包含(但未指向)tableCard[0]

int ** flop1 = & tableCard[0];
tableCards[2] = *flop1;
cout << **flop1 << endl;
cout << *tableCards[2] << endl;
flop1++;
cout << **flop1 << endl;
cout << *tableCards[2] << endl;


再次基于推论进行进一步的编辑...我怀疑您可能想将tableCard数组定义为:

int tableCard[48];


在这种情况下,您的代码应正确无误,而无需其他更改。好吧,大概是。整个问题似乎有点令人怀疑。

10-05 22:29