引用与指针小节

一 引用和指针的区别:

      引用是对已有名称的数据块起的一个别名,它与原先的名字作用一样,都对该数据块有操作权限,二者始终数据一致。

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;

 表达能力有限 先记下这些把,以后再补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值