zoukankan      html  css  js  c++  java
  • 指针引发的一个传值和传址的问题

    今天在编写程序时遇上了这个问题,记录如下。

    一个二叉排序树的搜索算法:

    最初代码
    1 int Search_BinaryTree(BinTree bt, KeyType key, BitNode* p, BitNode* pf)
    2 {
    3 p = bt;
    4 pf = 0;
    5
    6 while(*p != 0)
    7 {
    8 if(key == p->elem) return 1;
    9 if(key < p->elem)
    10 {
    11 pf = p;
    12 p = p->leftchild;
    13 }
    14 else
    15 {
    16 pf = p;
    17 p = p->rightchild;
    18 }
    19 }
    20 return 0;
    21 }

    结果在运行是出现了访问的错误。

    分析:

    传入的参数虽是指针类型,但在函数内部改变了这个指针的值。

    这便和基本类型的变量作为参数传递给函数时类似,只是一个传值的过程,在函数过程中对该变量的修改不会被保存。 

    按传址方式(指向指针的指针)修改后运行正常:

    指向指针的指针作为参数
    int Search_BinaryTree(BinTree bt, KeyType key, BitNode** p, BitNode** pf)
    {
    //查找二叉排序树bt中关键之为key的结点,*p指向该结点,*pf指向该结点的双亲结点。
    *p = bt;
    *pf = 0;

    while(*p != 0)
    {
    if(key == (*p)->elem) return 1;
    if(key < (*p)->elem)
    {
    *pf = *p;
    *p = (*p)->leftchild;
    }
    else
    {
    *pf = *p;
    *p = (*p)->rightchild;
    }
    }

    return 0;
    }

    稍作总结,在指针做参数传递给函数的时候:只能保留指针指向的对象改变的值。不能保留指针本身所做得修改。在需要修改指针本身的时候,需使用指向指针的指针作为参数。也便是传值与传址的差别所在。

  • 相关阅读:
    成熟失去快乐
    明天出发
    不知其期
    不是自己的机子就是不好
    都收拾完了
    文盲
    郁闷
    好像感冒了
    又都疯了
    流水账,从我开始接触计算机时写起
  • 原文地址:https://www.cnblogs.com/yyangblog/p/1922323.html
Copyright © 2011-2022 走看看