c++指针疑点
C++ pointers doubts
我对我在大学里看到的这段代码有疑问。
struct nodeList{
int data;
nodeList * next;
};
typedef nodeList * List;
void filter( List &l )
{
List * aux = &l;
while(*aux)
{
if( (*aux)->data > 3 )
{
List toDelete = *aux;
*aux = (*aux)->next;
delete toDelete;
}
else
{
aux = &((*aux)->next);
}
}
}
我不知道,
List * aux = &l;
实际上是做什么的。因为List
与nodeList *
相同,所以,代码将是nodeList * * aux = &l;
,这实际上是我不理解的,是指向一个指针的指针,该指针保存nodeList struct
的指针的地址吗?我看不懂的第二件事是最后一行。
aux = &((*aux)->next);
为什么aux
左边没有*
?如果它被声明为List *aux = &l;
是List
只是一个指针到第一个节点?
提前谢谢你。我用谷歌搜索了很多,但没有找到任何答案。如果你能回答我的问题,我将非常感激。
-
。
-
您应该始终匹配数据类型。
aux
是nodeList **
,因此任何赋值都应该具有相同的数据类型。由于((*aux)->next)
是nodeList *
,所以使用&
运算符来获得nodeList **
。
数据类型
变量具有特定的数据类型。例如,aux
是List*
,但List
是nodeList*
的别名,因此aux
是nodeList**
。
但是表达式作为一个整体也有数据类型。例如
- 表达式
((*aux)->next)
数据类型为nodeList *
,&((*aux)->next)
数据类型为nodeList **
。您使用&
运算符来获取变量的内存地址,使用&
的结果数据类型是多一个星号。 - 表达式
*aux
的数据类型是nodeList *
,因为aux是nodeList **
,星号运算符通过指针获得指向元素的值,有效地从数据类型中删除一个星号。
void filter( List &l )
这意味着"按引用传递"而不是"按值传递",即传递指向对象l的指针而不是将l复制到堆栈中。就它在计算机上的实际工作方式而言,"void filter(List &l)"answers"void filter(List *l)"之间没有区别,因为它们最终都是传递给函数的指针。然而,从编码器的角度来看,"void filter(List &l)"的优点是编译器确保您不会得到'nullptr'。
List * aux = &l;
这意味着"给我一个指向对象l的指针"。符号"&"在C/c++中用于许多不同的事情,在这种情况下,它的意思是"给我地址"。aux
是一个指向List类型对象的指针,而不是一个指向List类型对象的指针(当然这里的List本身就是一个指向nodeList的指针)。
aux = &((*aux)->next);
*aux
是aux所指向的对象,它是一个"nodeList*"。(*aux)->next
是aux所指向的List对象所指向的nodelist对象中的下一个指针。aux = &
设置aux指针指向这个对象。
这段代码不是特别清晰或简洁,所以我假设这样写是作为一个教育工具,看看你是否理解C/c++中的指针、引用和地址。因此,也许您应该在C/c++指针教程中复习这些操作符的定义。
我不知道,
List * aux = &l;
到底是做什么的。因为List
与nodeList *
相同,所以,代码将是nodeList * * aux = &l;
,这实际上是我不明白的,是一个指针指向一个指针,该指针持有nodeList struct
指针的地址吗?
它从引用形参中获取等效指针的地址(因此实际上与nodeList**
相同)。
第二件我看不懂的事是最后一行。
aux = &((*aux)->next);
为什么左边的aux
没有*
?如果它被声明为List *aux = &l;
是List
只是一个指针到第一个节点?
aux
是一个引用,所以作为参数l
传递的原始指针将被改变。
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错