二级指针

来源:互联网 发布:简单视频编辑软件 编辑:程序博客网 时间:2024/04/29 08:01
int **p;int *q;int a;q=&a;p=&q;//p为指向指针q的指针;//*p=q,为指向a的指针//**p=*q=a

二级指针作为函数参数的作用:在函数外部定义一个指针p,在函数内给指针赋值,函数结束后对指针p生效,那么我们就需要二级指针。
二级指针在函数中的应用:
1,交换字符串变量

/*    a、b为指向str_a、str_b的指针    交换字符串即交换str_a、str_b的指向    更改指针的指向即更改指针内存中的值    传入函数时需要获取地址进行更改,不然不会改变实参的值,与变量是一个道理*/void swap_str(char **a , char **b){    char *temp = *a;    *a = *b;    *b = temp;}int main(void){    char *str_a = "hello world";    char *str_b = "world hello";    swap_str(&str_a , &str_b);    printf("%s %s\n",str_a,str_b);    system("pause");    return 0;}

2,O(1)时间删除链表节点

/*    O(1)时间删除链表节点,将待删除节点的Next复制给该节点,并删除Next节点    当链表中只有一个节点时,需要改变头指针的指向,指向NULL    所以需要传入指向头指针的指针*/void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted){    if(!pListHead||!pToBeDeleted)    {        return;    }    //待删除节点为中间节点(有Next节点)    if(pToBeDeleted->m_pNext != NULL)    {        ListNode* pNext =pToBeDeleted->m_pNext;        pToBeDeleted->m_nValue=pNext->m_nValue;        pToBeDeleted->m_pNext=pNext->m_pNext;        delete pNext;        pNext=NULL;    }    //链表只有一个节点,删除头节点    if(*pListHead==pToBeDeleted)    {        delete pToBeDeleted;        pToBeDeleted=NULL;        *pListHead=NULL;    }    //删除尾节点    else    {        ListNode *pNode=*pListHead;        while(pNode->m_pNest!=pToBeDeleted)        {            pNode=pNode->m_pNext;        }        pNode->m_pNext=NULL;        delete pToBeDeleted;        pToBeDeleted=NULL;    }}

3,二叉搜索树转换为有序的双向链表

/*  递归  中序遍历的顺序,左子树转换后的最后一个节点与根节点相连,  根节点与右子树转换后的第一个节点相连*/BinaryTreeNode* Convert(BinaryTreeNode* pRootNode){    BinaryTreeNode* pLastNodeInList=NULL;    ConvertNode(pRootNode,&pLastNodeInList);//传入二级指针    BinaryTreeNod* pHeadofList=pLastNodeInlist;    while(pHeadofList->mLeft!=NULL & pHeadofList!=NULL)    {        pHeadofList=pHeadofList->mLeft;    }    return pHeadofList;}//需递归调用函数,改变pLastNodeInList的指向,所以传入二级指针void ConvertNode(BinaryTreeNode* pNode,BinaryTreeNode** pLastNodeInList){    if(pNode==NULL)        return;    BinaryTreeNode* pCurrent=pNode;    if(pCurrent->mLeft!=NULL)    {        ConvertNode(pNode->mLeft,pLastNodeInList);    }    pCurrent->m_Left=*pLastNodeInList;    if(*pLastNodeInList != NULL)   //不要忘记判断节点存在    {        pLastNodeInList->mRight=pCurrent;    }    *pLastNodeInList=pCurrent;    if(pCurrent->mRight!=NULL)    {        ConvertNode(pNode->mRight,*pLastNodeInList);    }}

4,改错

void GetMemory( char *p )//此处应传入二级指针{      p = (char *) malloc( 100 );} void Test( void )  {      char *str = NULL;      GetMemory( str );       strcpy( str, "hello world" );      printf( str ); }/*Test函数使用str作为形参传入,会产生指针的拷贝str_cpy即p传入GetMemory中,此时所分配的内存的地址是给拷贝的指针p。*/
1 0