关于指针的引用与指针的指针的理解

来源:互联网 发布:电脑版淘宝怎么找微淘 编辑:程序博客网 时间:2024/05/16 05:15

         今天上午在学习数据结构的过程中,写了一段错误的代码,找了一上午的错误才发现是因为用错了指针的问题,错误的关键点是:将指针当做形参其实也是值的传递,在在副本中改变了指针变量的内容,即函数内部改变了指针的指向,在函数外部指针的指向并没有改变。这种情况下应该要用双重指针或指针的引用作为形参。多说无益,直接上代码。

#include <iostream>using namespace std;void f1(int *a)//错误方法{int *s=new int;*s=1;a=s;}void f2(int **b){int *s=new int;*s=2;*b=s;}void f3(int* &b){int *s=new int;*s=3;b=s;}int main(){int *a;a=NULL;f1(a);cout<<*a<<endl;f2(&a);cout<<*a<<endl;f3(a);cout<<*a<<endl;return 0;}
        我的本意是在main中定义一个int*的变量,然后在f()函数中申请一块内存,让这个变量指向这块内存。最开始的想法就是f1()函数,然而当执行完f1()函数,然后输出时提示运行错误,仔细分析一下,这里肯定会出现运行错误,f1()函数形参的a是main()中a的一个副本,都是一个指针变量,main()中的a指向NULL,f1()中的a最开始也指向NULL,然而函数内部申请一一块内存s,并让a指向了s。再回到main()函数中,此时输出a的内容当然会提示运行错误,因为a指向的是一个NULL,没有内容。main()的a只分配了a的空间,而没有分配*a的空间;

        要想做到在函数内部改变指针的指向,在函数外部也能得到更新,就必须使用双重指针或者指针的引用。先来谈谈双重指针,也就是指针的指针,看看f2()函数,形参是一个双重指针,实参是一个指针变量的地址,b的内容装的是main中a的地址,而a的内容也是一个地址,刚开始指向NULL,在f2()中申请了一块内存s,,*b即是a指向是同一块内存,改变*b的内容就是改变了a的内容;

        再来说说指针的引用,如果b是a的引用,则a和b指是同一块内存,f3()中,b是一个int*变量的引用,是a的引用,即b和a是同一块内存空间,改变b的内容(b的指向)就是改变a的内容(a的指向)。

0 0
原创粉丝点击