引用与指针的用法
指针变量用于存储数据的地址,使用方法如
Int i=0;
Int *p;
P=&i; //此时,p的值为i的地址,*p为地址所储存的数值也就是i的值,i的值为地址所存放的值也就是*p的值,&i的值为i的地址,即:*p==i;p==&i;
引用为c++才有的功能,引用变量不占用内存,可理解为函数的别名,使用方法如
Int i=0;
Int &p=i; //引用定义时必须绑定一个变量,此时p==i,&p==&i;引用变量可作为实参传入函数(函数需声明传入的变量为引用类型)
指针变量(type *)与引用变量(type &)均可作为实参转入函数,对地址内的数据进行修改。个人认为,每个变量均具有地址与数值两种属性,函数传入变量中如果要求传入类型数值,则单传入数值,函数会另开辟内存来对传入数值进行处理,函数内均为局部变量;若传入的参数中带有数据的地址,则到相应地址访问获取数值并进行处理,引用变量具备了原变量的地址与数值的属性,故可作为实参传入函数
使用引用作为函数参数,函数就不用另外开辟内存来储存传入的数值,一定程度上节约了内存的占用,如果不想传入的变量实际值被修改,可加const(可读不可写)修饰
Int switch(int a,int b){
Intt;
t=a;
a=b;
b=t;
}
Int switch_2(int &a,int &b){
Intt;
t=a;
a=b;
b=t;
}
Int main(){
Intx=0;
Inty=1;
Switch(x,y); //这里的x传到函数的时候,函数应该是先执行int a=x,int b=y;故处理的实际为a与b的值而非x与y,所以传入变量仅作为形参;
Switch_2(x,y);//这里函数先执行的是int&a=x,int &b=y;然后对引用变量a与b进行处理,因a与b具有x,y的地址与数值属性,所以实际处理的是x与y的值。
}
数组的引用
数组的引用为数组的别名,使用方法如下:
Int num[20];
Int (&p)[20]=num; //引用类型后面中括号为引用数组的大小,若不一致则出错,右值为数组名,亦为数组的首地址,这里理解为数组名会好点;可用在函数里,使函数传入固定大小的数组;
数组名与指针
数组名可作为数组的首地址使用,一般可以理解为是静态指针int * const p(地址不可改),但数组名并不等同于静态指针,如
int a[10];
int *p;
p=a;
p==a;
sizeof(a);//此处的返回这为4*10个字节(int类型4字节),也就是数组的大小
sizeof(p);//此处的返回值为4,int类指针的大小;
int const *p与int *const p
int const *p中const修饰的为*p,故*p的值可读不可写,也就是指针所指的值,但是可以重新给指针赋值
int * const p中const修饰的为p,故p值可读不可写(初始化之后),也就是指针所指向的值可以修改,但是不可以给指针赋值(该指针只能指向初始化时的地址)
参考内容:http://blog.youkuaiyun.com/sunhero2010/article/details/49429267
reinterpret_cast与const_cast
reinterpret_cast的用法
reinterspret_cast<void *(亦可以为int或unsigned int,此时则等同于强制类型转换)>(*p)
例:
unsigned int i= 1633837924;
unsigned int *p=&i;
unsigned char *p2;
//p2=p;这样会出错,因为类型不同
p2=reinterpret_cast<unsigned char*>(p);//这里p2会获取p的地址,并转为char*类,但因为int类指针指向的是4个字节的数据,而char指针指向的是一个字节的数据,所以这里会存在一个转换,p2会把p所指向的地址数据拆分为4份,每份1个字节,然后把每个字节的二进制数转为相应ascii码表里的字符,并将这些字符组合为一个字符串。比方说这里的p指向的i值为1633837924,转为二进制后为0110 0001 0110 0010 0110 0011 01100100,每一个字节转为10进制则是97 、98、99、100,对应ascii码表则是abcd,相当于p2=“abcd”;
cout<<p2;//由上一个分析可以得出,此处应打印“abcd”以及一堆乱码(没有\0结束符),然而打印出的却是“dcba”以及一堆乱码,如果只是abc,也就是0110 0001 0110 0010 0110 0011的话,则会打印“cba”并不会出现乱码(首位补0,\0的ascii码为0),所以实际应为p2=“dcba”;(因为没时间考究,个人猜测int类型的储存方式为0110 0011 0110 0010 0110 0001 00000000,而非00000000 0110 0001 0110 0010 0110)
http://blog.youkuaiyun.com/rumlee/article/details/47122603
const_cast的用法
const_cast<const int */int *>(*p)主要是用于把const指针转普通以及普通转const
例:
int i=1;
int *p;
int *const p=&i; //注意const位置,p所指向的值可读不可写,即*p=4不可行
int *p2=const_cast<int *>(p);//此时p2所指的值可读写,*p2=4可行
参考网站:http://blog.youkuaiyun.com/jianguo_liao19840726/article/details/16939507