c/c++语言指针和引用是理解

         初学c的指针和引用后一直不清楚指针和引用的区别,在读了一些文章以及自己的体验过后,我来发表一下我关于指针和引用的看法。

        首先,我们都知道程序的执行是在内存中的,而在c语言中不同的代码块,分别存放在不同的区域内部,大致就是三个区域:静态变量区,堆区和栈区。我们所写的函数都是存放在栈区里的,赋值的数据都是储存在静态变量区,就像我们使用这句语句:int a=10;其中的a是存放在栈区里的,而我们给a赋值的10是存放在静态变量区的,至于堆区,我们可以将它理解为,我们使用new语句开辟的空间,就是从堆区得到延展的空间。那么指针是什么?指针就是一个变量,但这个变量存放的是一个地址,地址也是一个数据。他没有什么神奇的,就是一个存放地址的变量,他所存放的地址,就是我们指针指向的参数的地址。那么引用是什么呢?引用其实就是变量本身。如何理解呢,我们下面来看些简单的例子;

      

                #include <iostream>
                using namespace std;

                int main(){
                    int a=10;
                    int *p=&a;
                    int &b=a;
                    cout<<"a的地址是:"<<endl;
                    cout<<&a<<endl;
                    cout<<"p指向的地址是:"<<endl;
                    cout<<p<<endl;
                    cout<<"p所占内存的地址是:"<<endl;
                    cout<<&p<<endl;
                    cout<<"b所占内存的地址是:"<<endl;
                    cout<<&b<<endl;
        }

运行结果:

                       a的地址是:
                        0x6ffe14
                        p指向的地址是:
                        0x6ffe14
                        p所占内存的地址是:
                        0x6ffe08
                        b所占内存的地址是:
                        0x6ffe14

        从运行结果中,我们可以看到,p指向的地址为a的地址,所以变量p所保存的地址就是a的地址,也就是说p的值等于a的地址,但是,p的内存地址,也就是p在栈区的地址和a的地址是不一样的,也就是说他是一个单独的变量。而b我们取它为a的引用,从运行结果可以看出来,b在栈区所占的内存地址和a在栈区所占的内存地址是一样的,也就是说,他们两在同一块内存上,这也表明我们的b和a本质上是同一个东西。也就是我们常说的,引用是原变量的别名。下面我们再来看几个例子:

        

                        #include <iostream>
                        using namespace std;

                        void change_1(int *p){
                            int a=10;
                            p=&a;
                        } 

                        void change_2(int &p){
                            int a=10;
                            p=a;
                        }

                        int main(){
                            int a=1;
                            int *p=&a;
                            cout<<"刚开始p指向地址储存的值是:"<<endl;
                            cout<<*p<<endl;
                            cout<<"a的值是:"<<endl;
                            cout<<a<<endl;
                            change_1(p);
                            cout<<"改变后p指向地址储存的值是"<<endl;
                            cout<<*p<<endl;
                            cout<<"改变后a的值是"<<endl; 
                            cout<<*p<<endl;
                            int &l=a;
                            cout<<"刚开始l的值是"<<endl;
                            cout<<l<<endl;
                            cout<<"此时a的值是"<<endl;
                            change_2(l);
                            cout<<"改变后l的值是"<<endl;
                            cout<<l<<endl; 
                            cout<<"改变后a的值是"<<endl;
                            cout<<a<<endl; 
     
    
                        }

        运行结果:

                        刚开始p指向地址储存的值是:
                        1
                        a的值是:
                        1
                        改变后p指向地址储存的值是
                        1
                        改变后a的值是
                        1
                        刚开始l的值是
                        1
                        此时a的值是
                        改变后l的值是
                        10
                        改变后a的值是
                        10

        这里我们可以看到,我们传入的指针并没有按照我们的想法改变他的值为10,但是引用按照我们的想法改变了,这是为什么呢?原因很简单,我们传入的指针,其实并不是指针本身,而是其参数的一个拷贝,你看到的是p指针,但是其实他不是,他是p指针的一个复制,拷贝,也可以看成他的双胞胎姐妹,看着是,但不是同一个人,这两个指针只是刚开始指向同一个地址,但是后来,在函数里,他们的指向就不一样了。所以我们主函数里的原来的指针p他还是那个,他没有变的,他指向的还是值为1的a的地址,但是,函数里传入的指针p,他指向的是局部变量函数里的值为10的a,所以,p前后的值都没有改变,而引用的值前后,发生了变化,这也就是说,应用和原来的参数实际上就是同一个东西,只是换了一个名字,就像,假设你是那么家的独生子,你爸爸的儿子,和你爷爷的孙子,这是同一个人,只是叫法不同。

        好啦,这就是我所理解的引用和指针的区别,今天就讲到这里吧

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇

)">
下一篇>>