C/C++笔记

C/C++笔记

1、指向指针的指针(即2级指针)用处:如果在一个函数内部需要修改指针所指向的数据内容,那就使用指针,如果你要修改指针的指向,那就使用指向指针的指针。
通俗来说,如果我们需要函数的参数是一个地址,而且函数需要修改这个地址,那么我们就要传递2级指针。

int a = 1;
int* p = NULL;
p = &a;

则p是指针的值(即p指向的变量a的地址),*p是p指针指向地址中的那个值。
总之,指针的值是地址没错,但不是指针变量本身的地址,而是它所指向内存单元的地址。

void change(int* p){
   *p =*p+1;}//形参*p值的变化可以传回主函数
void main(){
   
 int a = 1;
 int* m = &a;
 change(&a); //只能改变a的值
 change(m); //同样只能改变a的值,而不能改变指针m的值,即指针m指向不变
 /*总结:change(m)只能改变指针m指向变量的值,即只能改变指针m指向地址中 的那个值。通俗来说,change(m)只改变了指针m指向的单元的值,而为改变m的 指向(即m值本身,m数值仍然是变量a的地址) */
}
void change(int** p){
   ...}//形参*p和**p值的变化可以传回主函数
void main(){
   
 int a = 1;
 int* m = &a; //即*m=1
 change(&m);  //int** p,等价于p=&m,*p=m,**p=*m;
/*change(&m)可以通过处理change函数中*p和**p值改变主函数中m和*m的值 即通过二级指针可以改变一级指针的指向(即指针的值或指针指向的内存单元地址),可以改变一级指针指向变量的地址。 */

二级指针反映在链式顺序结构的单链表中就是:

change1.c:
    change1(LinkList **p1){
   ...} //能传回*p1和**p1的改变(到主函数)
change2.c:
    change2(LinkList *p2){
   ...} //能传回*p2的改变(到主函数)
main.c
    LinkList *mylist; //mylist是头指针,
    //&mylist的值是头指针的地址,mylist的值是第一个结点的地址,
    //*mylist是第一个结点的内容(即第一个节点的值)
    change1 (&mylist); //&mylist=p1,mylist=*p1,*mylist=**p1,
    //即此调用可以改变mylist和*mylist,即该调用可以改变第一个
    //结点的地址和第一个结点的内容,即可以改变头指针的指向以及
    //头指针指向单元的内容
    change2 (mylist); //mylist=p2,*mylist=*p2;
    //只能改变第一个结点的内容(包括data和Next),即只能改变第一个
    //结点的数据和指针,即只能改变头指针指向的结点的数据和指针(值),
    //头指针的指向则无法改变

举例:彻底理解链表中为何使用二级指针或者一级指针的引用https://blog.csdn.net/u012234115/article/details/39717215

全部评论

相关推荐

美团 后端开发 总包n(15%是股票)
点赞 评论 收藏
分享
10-25 00:32
香梨想要offer:感觉考研以后好好学 后面能乱杀,目前这简历有点难
点赞 评论 收藏
分享
评论
点赞
1
分享
牛客网
牛客企业服务