如何获取指针指向的值的地址

时间:2012-09-10 22:12:40

标签: c++ arrays pointers dereference

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]的数组。而且,当我看到评论和答案时,这个问题一定很混乱。

1 个答案:

答案 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];

在这种情况下,您的代码应该是正确的,不需要进行其他更改。好吧,大概是。整个事情似乎有点可疑。