传值与传引用

1、在C++中,可认为只有传值和传引用。传指针本质上就是传值。将a指针传给b指针,两个指针是两个对象(而引用是别名),它们的值相等,即a、b指向同一块内存。这个时候,要千万注意:修改指针使它指向另一块内存与修改指针指向的内容之间的区别。以b为例说明,修改b使它指向另一块内存,a不变,还是指向原来的内存,内容也不变。修改b指向的内容,由于a,b指向同一块内存,也就是修改a指向的内容,a内容发生变化。

2、复制指针是浅拷贝,两个指针地址相同,共享同一块内存。如何进行深拷贝?

  把原指针指向的内容做一个整体拷贝,新指针指向拷贝的内容,这就是深拷贝。注意:深拷贝后,每个指针指向不同的内存,内容相等,但是指针值不相等。

3、考虑,下面的需求:指针a传给指针b,我们通过修改b指向的内容,也就相当于修改a指向的内容。那么考虑。a传给c,我想通过修改c,来修改a的指向,该怎么办呢?

  a、创建一个指针a的引用,相当于给指针取个别名,这种情况下,修改别名的指向,就是修改a的指向。注意:指针的引用的写法,考虑int的引用为int &a;那么int指针的引用就是int* &pi。特别注意:没有引用的指针的概念。也就是说,没有int& *pi;指向引用的指针就是指向原对象的指针,即int *pi。很好理解:引用是别名,指向int& 的指针就是,指向int的指针。因此,没有指向引用的指针的概念。

  b、增加一个间接层,使用指针的指针。

4、引用本身也是用指针实现的,可认为引用对指针进行了封装。行为上像个对象,可认为是对象的别名,传递时避免了对象的整体拷贝。

 1 //int a =3;
 2 //int b =7;
 3 //int* p1 = &a;
 4 //int* p2 = p1;
 5 //*p2 = 5; // 修改p2指向的内容,p1的内容也发生变化
 6 //p2 = &b; // 修改p2的指向,p2的内容变化,p1的指向不变,内容不变。
 7 
 8 
 9 //int a =3;
10 //int b =7;
11 //int* p1 = &a;
12 //int* &p2 = p1;
13 //p2 = &b; // 修改别名的指向,就是修改原指针的指向
14 //*p2 = 8; // 修改别名指向的内容,就是修改原指针指向的内容。
15 
16 //int a =3;
17 //int b =7;
18 //int* p1 = &a;
19 //int** p2 = &p1; // p2是指针的指针
20 //*p2 = &b; // 修改p2指向的内容,就是修改p1的指向
21 //**p2 = 8; // 两次解引用,修改p2的内容,就是修改p1的内容

 

posted on 2014-03-04 19:59  Andy Niu  阅读(1773)  评论(0编辑  收藏  举报