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

Posted

技术标签:

【中文标题】如何从该指针获取指针指向的值的地址【英文标题】:How to get address of value pointed by pointer from that pointer 【发布时间】:2012-09-10 22:12:40 【问题描述】:

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

我有一个代码:

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

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

【问题讨论】:

您在那里尝试做的事情非常令人困惑。你真的想要一个指向常量整数 (const int* []) 的指针数组吗?该代码甚至可以编译吗?实际上,您将const int** 分配给const int*。更正我自己,它可能会编译,但仍然不推荐。 sry,tableCard[48] 是一个指向整数的指针数组 它看起来很混乱,但它工作没有问题,我什至不知道,不推荐什么。我唯一的问题是将 *flop1 值的地址分配给另一个 int 指针,以在我增加 flop1 时更改另一个指针值,以便 flop1 指向另一个值。 :( 当您将一个指针分配给另一个指针时,您只是在复制源指针中包含的地址。接收变量只保存源变量包含的内容,因此,如果没有更多信息,就不可能获得源指针的地址。也许如果你使用了一个指针引用数组......虽然不知道这是否可能 我只想有一个指针,它会根据指向指针的目标更改其取消引用的值。而且我不能有一个指向指针的数组,因为该数组中的某些值将只是指向整数的指针。 【参考方案1】:

这不应该编译:

int * flop1 = & tableCard[0];

tableCard[0] 的类型是int*,所以当你用&amp; 引用它时,它就变成了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] 仍然包含(但不指向)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];

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

【讨论】:

sry,tableCard[48] 是一个指向 int 的指针数组,我编辑了它,sry 你把指向整数的指针数组称为什么,@LukasSalich?我们知道您正在使用指向整数 (int*[]) 的指针数组,并且答案清楚地假设了这一点。 哦,抱歉,我没有发现tableCardstableCard 之间的区别。使用类似的名称不是一个好主意。无论如何,同样适用。如果您所有的卡片数组都是 int 指针,请查看我关于使用双指针的答案末尾附近的编辑。我会修复它以使用tableCard[0] 问题是我不能使用双指针,因为我已经有一个只有单指针的数组。当我尝试使用集合进行更快的擦除和插入时,问题就出现了。我完全被卡住了,所以我将重写向量上的所有内容,并且不需要指针数组来分配集合元素。 但是单指针数组和双指针是一样的。 ie int *tableCard[48];int **tableCard = new int*[48]; 有点像。我认为您在理解指针和数组时遇到了麻烦。您还没有解释为什么要存储 int 指针数组而不仅仅是 int。数组tableCard 究竟代表什么?

以上是关于如何从该指针获取指针指向的值的地址的主要内容,如果未能解决你的问题,请参考以下文章

如果获取类的指针

qt如何获取主窗口的指针

为啥指针+1包含的内存地址与被指向的值的地址+1不同

c++ 怎样从任意类获取CDocument类指针

GO-指针与函数

如何快速获取指向视图控制器的全局指针