C++中,int * &a=new int 到底是什么意思
根据实验得出结论:a是静态空间上的一个别名。a是指针变量。如果这样说,那么int&c;intb;c=b;这样会错误,但所谓的错误其实是运行到第三步才错误。第一步int&c...
根据实验得出结论:
a 是静态空间上的一个别名。 a是指针变量。
如果这样说,那么
int &c ;
int b;
c= b;
这样会错误,但所谓的错误其实是运行到第三步才错误。第一步 int & c;没有错,系统给 c分配了一块内存,只不过后面又要修改地址所以出错。
int * &a=new int ;
可以说这里引用没有初始化,它接受了系统给他分配的随机静态内存地址当做是初始化了???
我问题里的矛盾点看明白没?
int * &a=new int ;请问a是在静态空间还是在动态空间?
是静态吧?请问是不是系统随机分配的呢?是 吧?
作为一个引用,能接受随机分配的内存?
那我 Int & a; 这样为什么不行,系统随机分配一个内存,这个内存的别名叫a 展开
a 是静态空间上的一个别名。 a是指针变量。
如果这样说,那么
int &c ;
int b;
c= b;
这样会错误,但所谓的错误其实是运行到第三步才错误。第一步 int & c;没有错,系统给 c分配了一块内存,只不过后面又要修改地址所以出错。
int * &a=new int ;
可以说这里引用没有初始化,它接受了系统给他分配的随机静态内存地址当做是初始化了???
我问题里的矛盾点看明白没?
int * &a=new int ;请问a是在静态空间还是在动态空间?
是静态吧?请问是不是系统随机分配的呢?是 吧?
作为一个引用,能接受随机分配的内存?
那我 Int & a; 这样为什么不行,系统随机分配一个内存,这个内存的别名叫a 展开
6个回答
展开全部
引用就是对其它标识符的一个别名。
1、引用在一定程度上以理解为 T* const p;
p是常量*p不是常量,所以在声明定义时必须初始化。 因此你所说的
int &c ;
int b;
c= b;
编译器一般不会编译通过的。不是说错误出现在第三步,而是在第一步时就错了
2、为什么引入引用的概念
代替指针,使代码编写更简洁,语法层上就是变量的别名,汇编角度和指针的概念是一样的,都是借助lea指令(ia32平台上) ,特别是面向对象的思想引入后,对象的内存越来越大,单纯的像c语言的struct结构体做返回值 会耗费大量的时间。
3、int * &a=new int ;
这个应该是编译不能通过的,c++是强类型的编程语言,左边是int *&类型,右边是int *,他们俩是不一样的类型,因此不能赋值的。
当然如下面的代码可以编译通过,但是如下面的代码纯属花码,即不产生任何机器指令,编译器有可能直接忽略掉这个表达式。从而只生成一句 ret的指令。
int main(){
int * &a=new int ;
return 0;
}
如果你加上一句cout<<a之类的操作语句,你会发现不能编译通过的。
我是菜鸟,希望能帮到你,观楼主英俊潇洒,风流倜傥,必当世豪杰,诚邀加入0x30百度贴吧,共商义举,建不世之功!
更多追问追答
追问
我问题里的矛盾点您看明白没?
int * &a=new int ;请问a是在静态空间还是在动态空间?
是静态吧?请问是不是系统随机分配的呢?是 吧?
作为一个引用,能接受随机分配的内存?
那我 Int & a; 这样为什么不行,系统随机分配一个内存,这个内存的别名叫a
追答
int main() { int *&a = new int; } 如这个代码
a在栈空间,它所指示的内存区域在堆空间也就是动态内存空间。
展开全部
定义引用的时候必须初始化,也就是说定义引用的时候必须告诉编译器,这是谁的引用(别名)
int *&a = new int;定义一个指针的引用,这个引用是new int分配的内存的别名
int *&a = new int;定义一个指针的引用,这个引用是new int分配的内存的别名
追问
怎么是new int分配的内存的别名
a , 他就是一个静态内存空间的别名, a是指针变量,是堆的地址, * a是堆的内容,
但是怎么能说引用是堆内存的别名?
这个引用,是静态内存空间的别名
追答
引用可以理解为一个变量的别名,它自身是不可修改的,一旦对它初始化之后,就没办法让这个引用来表示其他变量的别名,就好像如果指定小张是张三的别名,那么以后就不能有小张是李四的别名这种说法了
其实你以上的int *&a = new int;可以改写成下面这样
int *p = new int;
int *&a = p;
另外引用在使用上和它的原始变量没有区别,区别只在传参的时候属于传址
所以,如果不是用在传参的时候,是没有必要使用引用的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int * &a=new int; vs2012和gcc4.8编译错误。
new int返回右值指针,不能赋值给非常值引用(这可以从gcc的编译错误中看出)。原因是,临时变量理论上在表达式结束后会被析构,因而在后续代码中不可使用。应该改为int* const &a = new int; 即:将返回的指针赋给常值引用,因而该临时变量的生命周期得到延长。事实上,这等价于int* const a = new int;
new int返回右值指针,不能赋值给非常值引用(这可以从gcc的编译错误中看出)。原因是,临时变量理论上在表达式结束后会被析构,因而在后续代码中不可使用。应该改为int* const &a = new int; 即:将返回的指针赋给常值引用,因而该临时变量的生命周期得到延长。事实上,这等价于int* const a = new int;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这里a是一个引用,它是指向一个new int 类型的引用
//这样理解就好了
int *pb;
pb = new int;
int *&a = pb;
//这样理解就好了
int *pb;
pb = new int;
int *&a = pb;
追问
我不就是这样理解的?但是我的疑问。。。您看明白么
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int a;
int *&a=new int;
就是int *a=new int
int *&a=new int;
就是int *a=new int
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询