引用与指针的理解

引用与指针的用法

指针变量用于存储数据的地址,使用方法如

Int i=0;

Int *p;

P=&i;  //此时,p的值为i的地址,*p为地址所储存的数值也就是i的值,i的值为地址所存放的值也就是*p的值,&i的值为i的地址,即:*p==ip==&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=xint b=y;故处理的实际为ab的值而非xy,所以传入变量仅作为形参;

         Switch_2(x,y);//这里函数先执行的是int&a=x,int &b=y;然后对引用变量ab进行处理,因ab具有x,y的地址与数值属性,所以实际处理的是xy的值。

}

数组的引用

数组的引用为数组的别名,使用方法如下:

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);//此处的返回值为4int类指针的大小;

int const *p与int *const p

int const *p中const修饰的为*p,故*p的值可读不可写,也就是指针所指的值,但是可以重新给指针赋值

int * const p中const修饰的为p,故p值可读不可写(初始化之后),也就是指针所指向的值可以修改,但是不可以给指针赋值(该指针只能指向初始化时的地址)

参考内容:http://blog.csdn.net/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 9899100,对应ascii码表则是abcd,相当于p2=abcd;

cout<<p2;//由上一个分析可以得出,此处应打印“abcd”以及一堆乱码(没有\0结束符),然而打印出的却是“dcba”以及一堆乱码,如果只是abc,也就是0110 0001 0110 0010 0110 0011的话,则会打印“cba”并不会出现乱码(首位补0\0ascii码为0),所以实际应为p2=dcba”;(因为没时间考究,个人猜测int类型的储存方式为0110 0011 0110 0010 0110 0001 00000000,而非00000000 0110 0001 0110 0010 0110

http://blog.csdn.net/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.csdn.net/jianguo_liao19840726/article/details/16939507

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值