Sry,这必须在某处回答,但我还没找到。
我有一个代码:
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返回我想要的值,但* tableCards [2]在递增flop1后保持不变。
我认为tableCards[2] = & (* flop1);
会将* flop1指向的值的地址分配给int pointer tableCards [2]但是在递增flop1之后,tableCards [2]值保持不变。我不想在指针上使用指针数组而不是指针数组,因为所需的4/9值只是整数,而不是整数指针。
编辑:注意tableCards [9]是不同于tableCard [48]的数组。而且,当我看到评论和答案时,这个问题一定很混乱。
答案 0 :(得分:1)
这不应该编译:
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
现在指向的内存是什么。
[edit] 在考虑了这段代码可能尝试实现的内容之后......
的确,如果您希望flop1
现在指向第二个数组元素,则需要使用双指针(int**
)。这意味着flop1
现在是tableCard
数组中的迭代器,而不是元素......所以当你递增它时,它现在指向存储在tableCard[1]
而tableCards[2]
的指针。 1}}仍然包含(但不指向)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];
在这种情况下,您的代码应该是正确的,不需要进行其他更改。好吧,大概是。整个事情似乎有点可疑。