二级指针
来源:互联网 发布:简单视频编辑软件 编辑:程序博客网 时间: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
- 二级指针
- 二级指针
- 二级指针
- 二级指针
- 二级指针
- 二级指针
- 二级指针
- 二级指针
- 二级指针
- 二级指针
- 二级指针
- 二级指针
- 二级指针
- 二级指针
- 二级指针
- 二级指针
- 二级指针
- 二级指针
- jsPatch
- 5-1 最大子列和问题 (20分)
- 使用redis部署集群
- Codeforces Round #400 (Div. 1 + Div. 2, combined)B.Sherlock and his girlfriend【预处理素数+思维】
- Cocos Creator之向量旋转角度计算绘制直线运动轨迹
- 二级指针
- 实现一个简单的手机拍照效果
- webcron 定时任务管理系统
- iOS-UIStatusBar详细总结
- redis中密码设置
- CentOS安装与配置Mysql数据库
- Android屏幕直播方案
- Shadowsocks非官方网站
- 又见素数