【问题标题】:How do I de-reference a pointer that is inside of an array using its index?如何使用其索引取消引用数组内部的指针?
【发布时间】:2020-10-11 19:37:18
【问题描述】:

我正在处理一个堆栈分配,其中我们正在创建一个指向名为 Data 的结构的指针堆栈。我们的教授试图帮助我们在设计程序时养成良好的安全性习惯,这就是为什么我们有一堆指向结构的指针而不是一堆结构本身。

我知道,通常在取消引用指针时,您会使用星号。示例:

int x = 5;
int* xptr = &x;
cout << *xptr << endl;

我的理解是,上面的代码会创建一个值为 5 的 var x,然后是一个存储 var x 地址的指针,然后通过打印 *xptr,您正在取消引用该指针,这会导致打印输出为 x (5) 的值。如果到目前为止我在任何地方都不正确,请告诉我。

现在进入堆栈类,我的教授为我们创建了 .h 文件,我们拥有以下属性:

int top; // this is your top index
Data *stack[STACK_SIZE];

我对堆栈的理解是我们有一个指向数据结构的指针数组(如名称“堆栈”之前的 * 所示),堆栈的字面意思是“堆栈”。我的问题是:当我需要弹出一个 Data 结构(我称之为 popData)并且我想分配它的值时,我知道我不能只做 popValue = stack[top] 因为 popValue 是 Data 类型,它不能接收指针的赋值。

我想我可以这样做:

Data popData;
*Data popDataPtr;
popDataPtr = stack[top];
popData = *popPtr;

我认为这在逻辑上会起作用,但我想知道是否存在取消引用 ptr 并将其分配在同一行中的语法。我也在想:

popData = *stack[top];

popData = stack[*top];

但我不确定什么是正确的。我似乎无法在网上找到一个例子。提前感谢任何可以提供帮助的人。

【问题讨论】:

  • 我认为*stack[top] 应该编译。如果没有,*(stack[top]) 肯定会(我不记得顶部的优先级)。
  • 您是否尝试编译和运行这两个版本,看看会发生什么?
  • 我们的教授试图帮助我们在设计程序时养成良好的安全性习惯,这就是为什么我们有一堆指向结构的指针而不是一堆结构本身。 你的教授是否证明了这种说法?
  • 您应该按照@cigien 的建议自己尝试所有代码示例。
  • 指针数组(和指向数组的指针)从来都不是我的强项,所以我不能 100% 确定这里有什么正确的,但我很确定 *top 是不正确的. top 不是一个指针,所以你不应该尊重它。

标签: c++ arrays pointers dereference


【解决方案1】:
popData = *stack[top]; // this will do the trick

在这里,您正在访问您想要的指针,然后您将取消引用该指针并存储popData中指向的数据

【讨论】:

  • 除了这里,stack 是一个指针数组。 [] 给你一个单一的指针,OP 希望进一步取消引用。
【解决方案2】:

我建议您下次自己尝试一下,看看您的哪些示例可行。

您可以在一行中进行赋值,我建议您在这样的复杂表达式中也添加括号,这样您就不必记住运算符的优先级:

Data popData = *(stack[top]);

关于您的其他代码的小注释,这将无法编译:

*Data popDataPtr;

指向Data 的指针的语法与指向int 的指针没有什么不同,您以前也有:

int* xptr = &x;

因此,要使示例中的代码正常工作,您实际上需要

Data* popDataPtr;

在 C++ 中有一个很好的经验法则:从右到左阅读声明,例如:

Data * const ptr1; // ptr1 is a constant pointer to a Data
const Data * ptr2; // ptr2 is a pointer to Data which is const (or just to a constant Data)
Data * arr1[]; // arr1 is an array of pointers to Data.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 2012-03-25
    • 2011-02-04
    • 2021-07-04
    • 2011-10-20
    • 1970-01-01
    相关资源
    最近更新 更多