指针引用带来的思考

·
notes no tag March 8, 2022

动手写数据结构时候遇到了这样的问题,如果我不喜欢用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.

  • GBK转utf-8
  • new和malloc关键字
取消回复

说点什么?

© 2023 烈性果汁 . 京ICP备2022032198号