一 引用和指针的区别:
引用是对已有名称的数据块起的一个别名,它与原先的名字作用一样,都对该数据块有操作权限,二者始终数据一致。
int a =5; int &b =a; a 与 b所指的数据都是分给5的那块。所以 &a == &b二者地址是一样的。
#include "stdafx.h"
#include <iostream>
using namespace std;
void main()
{
int a= 5;
int &b =a;
if (&a == &b)
{
cout<<"Same"<<endl;//会执行到这里
}
getchar();
}
指针是申请一个地址空间来存放目标数据块的地址,他们也是对数据同一个数据快进行操作,只是它比引用多申请了一个存放地址的空间。
void main()
{
int a = 4;
int *b = NULL;
b = &a;
cin>>*b;
cout<<*b<<endl;
cout<<a<<endl;
cout<<&b<<endl;
cout<<&a<<endl;//a与b地址空间不同 a与 *b的值始终一致。
}
引用不可以这样写 int a = 5; int &b; b =a;编译时回报错 error C2530: 'b' : references must be initialized;而指针却可以先不进行赋值操作,所以引用一版没有空引用,而指针却又空指针,正常情况下 用引用的安全保障比用指针的高,用指针要经常判断是否为空指针的情况。
二 指针与引用的超能力表现
由于指针和引用都是直接对数据地址的操作,所以在使用时一定要注意指针和引用的这方面的操作。
比如
class Person
{
public:
Person():m_ID(5){};
int & GetPersonID(){return m_ID;}
private:
int m_ID;//设为私有类型
};
void main()
{
Person ps;
int& id = ps.GetPersonID();
cout<<id<<endl;
id = 3;
cout<<id<<endl;
cout<<ps.GetPersonID()<<endl;//此时ps的私有成员已经被改变为3了,这不符合我们原先定义m_ID为私有的本意;
getchar();
}
所以我们要么把函数改为
const int & GetPersonID(){return m_ID;}加上静态类型
要么就是不用引用的返回类型 而改为值传递,这样传回的就是该数据的一个副本,不会影响到私有成员的数据。
改为指针类型也一样
class Person
{
public:
Person():m_ID(5){};
int * GetPersonID(){return &m_ID;}
private:
int m_ID;//设为私有类型
};
void main()
{
Person ps;
int* id = ps.GetPersonID();
cout<<*id<<endl;
*id = 3;
cout<<*id<<endl;
cout<<*(ps.GetPersonID())<<endl;//私有成员也被改变了,解决方法与引用的相同。加上const 后编译时就会报错
getchar();
}
指针的 new 和 delete
int *p = new int(2);//在heap堆中动态申请一个整型数据的内存空间 并赋初值为2;cout<<*p<<endl; 输出2
在不用 p时 要调用 delete p; p = null,这时p指针仍然存在,只是不指向任何有效数据空间,释放p所指的内存空间,如果在释放之前 将p指向别的地址 如 p = NULL;那么p原先所指的内存空间将无法释放,而导致内存泄漏。
int *pp = new int[20];//动态申请20个整形数据空间,删除时delete []pp; pp =NULL;
表达能力有限 先记下这些把,以后再补充