指针与引用的关系
经常会看到关于指针与引用的关系,也有会它们之间的对比等等。但我确认不太想把引用与指针做太多的对比,在我看来引用更多的与普通变量相关,而不是与指针变量相关。虽然说它们本质上都是对内存空间的操作。但变量,指针变量,引用变量的操作内存来源都是内存地址所指向的空间。
定义变量,也是在内存区域开一块内存在使用。只是在编译时编译器对变量的地址直接进行解引用,或说编译作为中间人,把变量与内存址址绑定死了无法再指向其它内存区域,所以变量不能像指针那个重新指向其它地址。变量没办法再更改指向的内存空间,所以变量在赋值时只能把内容从一内存区域拷贝到另一个变量内存空间。
定义指针变量,也是在内存区域开一块内存空间使用,但指针编译器并没有做处理,把如何解引用内存空间的权限交给了程序。并没把指针与内存地址绑定死,所以它能重新赋值指向其它内存区域。正是这样指针的自由性,造成指针如果没有用掌控来带来程序未知道错误。指针可以改变指向的内存空间,所以指针变量在进行赋值可以直接指向要拷贝的内存空间(浅拷贝),也可以把另个指针指向的内存空间拷贝到另一个指针指向的内存空间(深拷贝)。
引用变量,其实它更像是正常普通变量的延伸,由编译器来把变量与内存空间在编译时绑定死。那么引用定义必须得到绑定的内存区域。所认需要初始化赋值给引用变量一个内存空间。且这种编译也是在编译时绑定死的所以程序不可以把引用变量指向其它内存区域。
正常变量内存区域只能变量本身访问,而引用可以让不同变量来访问同一块内存区域。引用会带来一定的不安全性,多个变量同时指向同一内存区域,多个变量可以读取一片内存区域,那么在多线程或程序修改数据时可能导致数据不同步问题。
示例代码
struct stu{
int age;
int height;
};
int main(int argc, char** argv)
{
struct stu s = {
110, 200};
struct stu& st = s;
struct stu* sp = &s;
struct stu& st2 = *sp;
printf("The s value:%d \n", s.age);
printf("The sp value:%d \n", sp->age);
printf("The st value:%d \n", st.age);
printf("The st2 value:%d \n", st2.age);
st2.age = 100;
printf("The st2 value:%d \n", st2.age);
printf("The sp value:%d \n", sp->age);
return 0;
}
虽然在一定程度上来说,常量指针也是不能更改指向内存区域,与引用具有相同效果。也有人证时引用的底层是使用常量指针方式来实现的。但从底层编译来说普通变量的实现也是通过指针来实现的,那为什么不把普通变量与指针变量对比。所以我更愿意把它作为一个普通变量的延伸理解。引用变量是普通变量的一种延伸,可以让普通变量申请的内存空间通过不同的变量来共享访问。就是这么简单。
引用的作用:把普通变量编译时绑定死的内存,可通过不同的变量来共享访问。