今天上机课比较无聊,看了一道比较经典的面试题:请说说指针和引用的区别?
话不多说,捋起袖子撸代码,实践出真知,先贴上代码:
#include<iostream>
using namespace std;
int main(){
char text='a';
char &text1=text;
char *text2=&text;
cout << "text值: " << text << " text1值:" << text1 << " *text2值:" << *text2 <<endl;
cout << "text地址: " << (void*)&text << " text1地址:" << (void*)&text1 << " text2地址:" << (void*)&text2 << endl;
cout << "text1++的值: " << ++text1 << " text2++的值: " << (void*)(++text2) << endl;
cout << "sizeof(text): " << sizeof(text) << " sizeof(text1): " << sizeof(text1) << " sizeof(text2): " << sizeof(text2);
return 0;
}
运行结果:
结果分析:
首先,我将text赋值为a,由于text1是text的引用,故text1的值也是a,text2指向存储text的内存空间,*text2的值自然也是a;
其次,输出text的地址,为0x22fe27,再来看text1的地址,同样是0x22fe27,而text2的地址为0x22fe18,由此可知,引用事实上就是给内存区域起了个别名,text和其引用text1所代表的内存区域是一样的,而指针则需要另辟一块内存空间,存放一个指向text的指针;
第三,引用自增自减就相当于被引用变量的自增自减,原因是他们都是代表的同一块区域,而指向text的指针text2自增自减则相当于指针向左或向右移动,本例中text2为char型指针,故自增为向右移动一个地址空间;
第四,sizeof(引用),其返回的值为被引用变量的数据类型长度,sizeof(指针)返回的是指针的长度,在64位系统中,其长为8,不管是char型指针、double型指针还是指向一个类的指针。
除此之外,指针和引用还有其他不同之处:
引用在被定义之后,便不能再被更改,若对引用再次赋值,则编译器会报错[Error] lvalue required as left operand of assignment;而变量则不然,除非使用了const关键字,否则它还可以指向其他区域。
引用不能被赋空值,而指针却可以指向NULL。