指针引用带来的思考
动手写数据结构时候遇到了这样的问题,如果我不喜欢用c风格的代码,写成c++的类,涉及到函数入参时候引发了一点点思考。
结构体版
typedef struct LNode {
int data;
struct LNode *next;
} LNode, *LinkList;//LinkList是个指针,当成类起了个别名
bool InitList(LinkList &L) {
L = (LNode *) new LNode;
if (L == nullptr)
return false;
L->next = nullptr;
return true;
}
类版
class LNode {
public:
int data;
class LNode *next;
};
bool InitList(LNode *&L) {
L = new LNode();
if (L == nullptr)
return false;
L->next = nullptr;
return true;
}
使用 LinkList
强调这是一个单链表,使用 LNode *
强调这是一个结点,这样是为了代码可读性,在初始化函数中,入参其实是LNode
类型的指针,指针地址指向了L
或者L2
的地址。此时传值不能直接传地址而要传地址的引用。
所以c++中的传值和引用的本质区别不在于是否传指针,而在于是否对源数据有可修改可能性,也就是是否可以将修改带出来。
若是class
版的入参不是引用,而只是单纯的指针,(bool Init2(LNode2 *&L2)
),虽然编译器不会报错,但是IDE会提示你if
语句Condition is always false
,意思是你的修改仅限于函数体内,new
操作后肯定非空指针。
Fun(ClassName *&varName)
相当于指针的引用 就是相当于指针的别名,地址相同。
另外感触就是c++不是一门死背语法来掌握的编程语言,而是理解其中的原理思想。类型不要只盯着int、某某class,而理解到他们在计算机中起实质作用是他们对应占用内存的大小,以及包含的内容。
A *a = new A(1);
A *&ra = a;
当 a重新指向其他的对象时如 a = new A(2); 此时ra关联的还是a,与A(1)和A(2)无关。
so its just a Function Fun , taking parameters Class *&varName
, which means it takes a reference to a pointer of type ClassName
and named this parameter varName
.
cause a pointer is an addressable location in memory , they have taken a reference &
of that actual pointer.