读书人

为什么要用二级指针解决方案

发布时间: 2012-02-20 21:18:24 作者: rapoo

为什么要用二级指针
两个单链表的类在实现插入节点操作时有所不同

C/C++ code
class IntSetList2 {   //using Listprivate:    int    n;    struct node {        int val;        node *next;        node(int i, node *p) { val = i; next = p; }    };    node *head, *sentinel;public:    IntSetList2(int maxelements, int maxval)    {    sentinel = head = new node(maxval, 0);        n = 0;    }    int size() { return n; }    void insert(int t)    // 消除递归1    {    node *p;        if (head->val == t)            return;        if (head->val > t) {            head = new node(t, head);            n++;            return;        }        for (p = head; p->next->val < t; p = p->next)            ;        if (p->next->val == t)            return;        p->next = new node(t, p->next);        n++;    }        void report(int *v)    {    int j = 0;        for (node *p = head; p != sentinel; p = p->next)            v[j++] = p->val;    }};


第二个
C/C++ code
class IntSetList3 {   //using Listprivate:    int    n;    struct node {        int val;        node *next;        node(int i, node *p) { val = i; next = p; }    };    node *head, *sentinel;public:    IntSetList3(int maxelements, int maxval)    {    sentinel = head = new node(maxval, 0);        n = 0;    }    int size() { return n; }    void insert(int t)// 消除递归2    {    node **p;        for (p = &head; (*p)->val < t; p = &((*p)->next))            ;        if ((*p)->val == t)            return;        *p = new node(t, *p);        n++;    }    void report(int *v)    {    int j = 0;        for (node *p = head; p != sentinel; p = p->next)            v[j++] = p->val;    }};

请问第二个链表的insert里面为什么要用node **p 二级指针 用一级指针行吗 为什么?
二级指针怎么理解好一点

[解决办法]
这边没有必要用 指针的指针的吧

一般在函数传递时,需要改变指针的值的时候,采用指针的指针。


[解决办法]
一般在函数传递时,需要改变指针的值的时候,采用指针的指针。

[解决办法]
形参传值都是实参的拷贝,所以要想改变地址的值必须要用到二级指针
[解决办法]
林锐 《高质量c\c++编程》
[解决办法]
简单的说2级指针指向的是个2维表的存储结构,多维以此类推


[解决办法]
无头节点链表当删除旧头节点时,新头节点的值需要更新,故要用二级指针将头节点传入需要删除节点的函数。

VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

[解决办法]
改变指针 的值 就把地址传过去 那不就是二级指针了
[解决办法]
用指针的引用比较好把

读书人网 >C语言

热点推荐