以上是ChatGPT的回答,应该是比较正确的回答,指针和引用是否分配内存空间,要看所使用的编译器。
本人使用的编译器:
指针和引用本质是一样的,经过编译器处理后,都是按照指针处理,占用内存空间。
对于指针和引用的区别,网上有很多讨论,大部分人说指针分配空间,引用不分配空间,引用只是变量的别名。有些定论并不是支持的人多就是对的,有时就是错误传承。别人说百遍,不如实验一遍,事实胜于雄辩。
#include <iostream>
using namespace std;
int main()
{
int a = 77;
int & ra = a;
int b = 0;
int* pa = &a;
ra = 88;
*pa = 99;
cout<<(&a+1)<<endl;//变量ra的地址,根据汇编代码看出ra地址在a地址的上边,即 a地址+4字节
cout<<hex<<*(unsigned long int *)(&a+1)<< endl; //变量ra地址中存放的值,即a的地址
cout<<&a <<endl;//变量a的地址
cout<<&b <<endl;
cout<<&pa <<endl;
return 0;
}
/*
打印如下:
0x7fff10068ec8
7fff10068ec4
0x7fff10068ec4
0x7fff10068ec0
0x7fff10068eb8
/*
反汇编上边的代码
验证的思路:确认是否给变量ra分配了内存?若分配了内存,内存中存储的值是否就是变量a的地址?
通过汇编代码可以看出给ra分配了内存空间,由于每个变量在栈内存中存储的顺序并不是按照代码行的顺序排的(因为编译器优化),ra的内存空间在a的上边,运行程序打印出ra地址空间的值,确实与变量a地址一致。
因此,在引用中 int &ra=a;这一句代码可被编译器看做int * const ra=&a;//加上const的作用是表明指针ra的自身的值不能改变,而指向的值可以改变。也就是说引用相当于指针,引用与指针在编译时的方法一样,指向的都是变量的内存地址。