代码改变世界

指针和引用

2012-07-28 21:24  javaspring  阅读(244)  评论(0编辑  收藏  举报

1、引用注意事项

     引用必须初始化

     引用初始化指向一个对象之后就不能再指向别的对象

     引用不能为空

     返回引用的函数可以作为左值来计算

     不能声明void类型的引用   int a=10;   void &p=a;   //error

     不能声明引用数组             int a[10];   int p[10]=a   //error

2、const引用

     const 修饰如果用在引用上会有一个特别之处,它的可以进行不同类型的对象的初始化,而这一切在普通变量操作上是不可能的

     例如:

     int a=10;
     int &test=a;                                //ok
     double &test1 = a + 1.2;            //error
     const double &test2 = a + 1.2;  //ok

3、传值、传引用、传指针区别

     传值:传的是该对象的一份拷贝的值,修改该值并不会改变原来的值

     传引用和传指针:不会产生临时拷贝,修改该值会改变原来的值

     通常使用引用或指针进行传参(作为返回值),比传值更加高效,因为没有临时变量的生成

4、引用实例

     int a1;
     int test1()
     {
         a1=10;
         return a1;
     }

     int &test2()
     {
         a1=10;
         return a1;
     }

     int &pn=test1();    //test函数按值返回,pn引用指向一个临时对象,当函数test结束后,pn就指向一个不存在的对象,程序出错

     int &pn=test2();    //test函数按引用返回,pn指向的就是全局对象a1

     test2()=10000;     //函数作为左值进行计算,该步之后pn的值变为10000

5、指针初始化注意事项

     const int i = 0;

     int *p = &i;        //ok,可以使用0值或者编译期间值为0的const变量初始化指针

     double d =1 0.0;

     p = &d;             //error,指针只能初始化或者赋值为同类型的变量地址

6、typedef和指针

     string str="1234235";

     typedef string* pstring;

     const pstring cstr=&str; //cstr为string类型的常指针,const修饰的是pstring类型,所以是一个常指针

     pstring const cstr=&str;

     string* const cstr=&str;     //以上三种写法等价

7、指针常见错误--------告诉我们当delete一个指针后,一定要将其赋为NULL

#include "stdafx.h"
#include <iostream.h>
#include <string.h>

//指针常见的错误,解决方法delete一个指针后,一定要将其赋为空
void main()
{
	int *p1=new int;
	*p1=10;
	delete p1;  //p1变成了一个迷途指针
	
	long *p2=new long;  //p2指向编译器释放掉的p1所指向的空间
	*p2=100;

	*p1=9999;
  
	//下面的输出说明p1和p2指向同一块内存空间
	cout<<p1<<" "<<p2<<endl;    //0x003F0F70  0X003F0F70
	cout<<*p1<<" "<<*p2<<endl;  //9999        9999
}