c++ - 如何使用其索引取消引用数组内部的指针?
问题描述
我正在处理一个堆栈分配,其中我们正在创建一个指向名为 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];
但我不确定什么是正确的。我似乎无法在网上找到一个例子。提前感谢任何可以提供帮助的人。
解决方案
我建议下次您自己尝试一下,看看您的哪些示例会起作用。
您可以在一行中进行赋值,我建议您在这样的复杂表达式中也添加括号,这样您就不必记住运算符的优先级:
Data popData = *(stack[top]);
关于您的其他代码的小评论,这将无法编译:
*Data popDataPtr;
指向 a 的指针的语法与您之前Data
使用的指向 a 的指针没有什么不同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.
推荐阅读
- node.js - Typescript lambda 找不到节点模块
- reactjs - 如何在反应中将道具从父组件传递给孙子组件
- python - django 可以通过 3 次查找预取相关工作吗?
- php - 为 PHP 7.0 而不是 7.4 安装了 Nginx SOAP 扩展
- javascript - 对象数组的第一个实例为空
- sql - 检查日期是圣诞节还是元旦的功能
- python - 如果存在匹配的维度(python/numpy),则无法创建参差不齐的数组
- oracle - 无法通过 shell 执行 .sql 来生成 csv 文件
- javascript - 如何使包含图像的整个刺痛模式在加载时可见?
- ffmpeg - ffmpeg 比例、重叠和不透明度