指针、引用、指针与引用区别。
变量:代码中常常通过定义变量来申请并命名存储空间,并通过变量的名字来使用这段存储空间。
//变量 int nNum; //声明名字为nNum的int型存储空间 nNum = 100; //nNum存储值100 nNum = 200; //改变nNum存储值200
指针:又叫一级指针,用来指示一个内存地址的变量。对于一个类型T(int、char、folat...),T*就是指向T的指针类型,一个T*类型的变量保存了一个T对象的地址。
//指针 int *pNum; //定义指针pNum pNum = &nNum;//pNum指向变量nNum在内存中的地址,而不是变量本身的值200(取地址运算符&:取变量的地址。如:&nNum为取变量nNum的地址) int nNum1 = *pNum; //取指针pNum指向存储空间值200(指针运算符*:从地址中取数据。如:*pNum为从地址pNum中取值)
指针变量:指针是地址,指针变量是存放地址的变量。
//指针变量 int *pVar = pNum;//等同int *pVar = &nNum;
二级指针:指向指针变量的指针。
//二级指针 int **ppNum = pVar;//
用一张图表示下二级指针:
C是常量;B是一级指针,B的值(即C的地址)是一级指针数据;A是二级指针,A的值(即B的地址)是二级指针数据。
空指针:不指向任何对象,指针变量值为NULL。指针为空的判断常常为了避免指针变量的非法使用。
int *pNum = NULL; ... if(NULL != pNum) { ... }
函数指针:是指向函数的指针变量。可用该指针变量调用函数,就如同用指针变量引用其他类型变量一样。
函数指针声明格式:类型说明符 (*函数名)(参数)
//函数min int min(int x,int y); //函数max int max(int x,int y); //函数指针 int (*pFun)(int, int); //使用函数指针调用函数 int nNumMin = 1; int nNumMax = 100; int nMin = 0; int nMax = 0; pFun = min; nMin = (*pFun)(nNumMin,nNumMax);//nMin = 1; pFun = max; nMax = (*pFun)(nNumMin,nNumMax);//nMax = 100;
指针函数:函数的返回值类型是一个指针类型,本质是一个函数。
指针函数声明格式:类型说明符 *函数名(参数) 或 类型说明符 *(函数名(参数))
int *pfun(int, int);//pfun是一个指向返回值为int的函数的指针
引用:是对象的别名,对引用的操作与对变量的直接操作一样。其主要用于函数参数和返回值类型,T&表示T类型的引用。引用不是数据类型,引用本身不占存储空间。
int i = 100; int &j = i;//&为标识作用,非取地址
1)指针可以指向空值,引用不能。如果一个变量指向另一个对象,它可能为空,应该用指针;它不允许为空,应该使用引用。
2)指针可以改变指向,引用不可以改变指向。引用初始化以后不能被改变,指针可以改变所指的对象。
3)指针的大小是固定字节(4个字节),引用的大小是所指变量的大小。