c++中的引用和指针在计算机中的表示一样吗?
c++中的引用和指针在计算机中的表示一样吗?
指针里面存储的是地址!
引用里面也存储的也是地址吗?
问题点数:0、回复次数:23Top
1 楼duanma(断码)回复于 2003-08-03 12:05:09 得分 0
两者有很大的区别,你看书上的概念就知道了~
不过,2者的联系倒是挺迷惑人的:
引用的一种最明显的实现方式是作为一个(常量)指针,但是一个引用并不是一个对象,不能想指针那样去操作!!!!!Top
2 楼MaiCle(原来小日本连畜生都不如)回复于 2003-08-03 12:24:25 得分 0
当然不一样了。
指针指向的是被访问对象的地址。
引用则是被访问对象的别名或别称。Top
3 楼MaiCle(原来小日本连畜生都不如)回复于 2003-08-03 12:25:07 得分 0
指针的用法是 "->"
而引用的用法是 "."
这也是一个区别呵。Top
4 楼Thor_Cascades()回复于 2003-08-03 12:32:32 得分 0
在计算机中的表示?指的是实现方法吗?Top
5 楼nandy_lau(我行我素)回复于 2003-08-03 13:20:13 得分 0
使用方法我知道!
疑问的地方:
"引用"不向指针那样用 -> * ,而是用.
但不知道引用在计算机中的实现是否和常量指针一样,里面存储的是地址! 只是用法不同而已!Top
6 楼eric8231(1328cire)回复于 2003-08-03 13:20:49 得分 0
指针变量里存放的是机器地址,所以在访问“所指对象”时需要用间接符“->”
引用是对被引用对象的另外一个名字,在访问“被引用对象”时不需要间接符。
对于引用,不同的实现机制可能会有不同的实现方法。 比较可能的一种是用常量指针实现引用。Top
7 楼eric8231(1328cire)回复于 2003-08-03 13:26:05 得分 0
其实即使在某个c++实现中确实是用常量指针来实现引用的,“引用”和“常量指针”还是有很大差别的。因为引用总的来说是面向高层次的引用方式,而指针是一种面向地层的摆弄机器地址的引用方式。Top
8 楼sandrowjw(我的小猫照片给弄坏了,心都碎了)回复于 2003-08-03 13:48:24 得分 0
如果你指的是raw data的话应该是一样的,但是他们的行为完全不同。Top
9 楼zcchm(lone wolf)回复于 2003-08-03 13:58:26 得分 0
编译器在实现引用时,保存的是对象地址,和指针一样。只是编译器不允许你把引用当做指针那样使用。Top
10 楼dxlbuaa(dxlbuaa)回复于 2003-08-04 00:30:09 得分 0
引用不是一种数据类型,编译器根本不给它分配什么
引用是一种语法,它是为方便程序阅读和编写而造出来的
所有传递引用的地方,都将被编译器换成指针
对引用使用&只能得到被引用变量的地址,根本就没有引用变量的地址
引用是一种语法!!就象是换一种说话的方法Top
11 楼hlnpro(错误!死机?晕~~~)回复于 2003-08-04 01:54:00 得分 0
引用在机器内存中确实仍然使用指针来表示的。
只有引用和指针可以实现多态,只有引用和指针可以使函数改变参数值!
可以参阅 c++本质论Top
12 楼simouse()回复于 2003-08-04 02:31:33 得分 0
指针有自己的地址,引用的地址就是引用物的地址Top
13 楼cxjddd(又是花开时)回复于 2003-08-04 08:42:43 得分 0
引用基本上是用指针实现的。Top
14 楼yjh1982(血精灵)回复于 2003-08-04 17:25:09 得分 0
同意 cxjddd(战士编程)Top
15 楼ninyjun2008(ninyjun)回复于 2003-08-05 20:14:11 得分 0
引用: alias -->object
指针: pointer--->alias->object
Top
16 楼xiaoyunet(快乐的小猪)回复于 2003-08-06 10:07:49 得分 0
引用是由指针来实现的,这是肯定的。
编译器在内部将你的引用转化为指针,至于引用的种种语法,都是编译器来检查和限制的。大家不要搞错了。编译以后的代码,哪里还有什么名字之类的东西,都是一堆地址而已了。Top
17 楼ThinkX(秋天的树)回复于 2003-08-07 01:47:27 得分 0
#include <iostream>
#include <string>
using namespace std;
struct B
{
int a, b, c, d, e;
};
struct D
{
B& _b;
D(B& b) : _b(b) { }
};
int main(int argc, char *argv[])
{
cout << sizeof(B) << endl;
cout << sizeof(B*) << endl;
cout << sizeof(B&) << endl;
cout << sizeof(const B&) << endl;
cout << sizeof(D) << endl;
cout << sizeof(D*) << endl;
cout << sizeof(D&) << endl;
cout << sizeof(const D&) << endl;
cin.get();
return 0;
}
自己看看结果,可能有些意外,但是显然在D中,引用就是用指针处理的。Top
18 楼nandy_lau(我行我素)回复于 2003-08-07 09:34:50 得分 0
现在我两种理解:
第一种理解:
.引用是用指针实现的,但是有不同于指针的语法。
例如:声明一个引用
int ival = 1;
int &refIval = ival;
这时,为引用分配一个存储空间(有他自己的地址),他里面存储的的是ival的地址。
与指针的做法相同,但是引用和变量绑定,不能再指向其他的地址。
一句话:引用是对指针的一个伪装,伪装成变量的用法。但实现和指针一样,但有限制。
第二中理解:
引用自己不分配存储空间,在编译时候,用到引用的地方,用引用变量的地址代替!
各为:我的那种理解正确哪? 或者都不正确,那么请各位指点??
小弟先谢谢各位!Top
19 楼eric8231(1328cire)回复于 2003-08-07 20:12:28 得分 0
你的第二种理解基本可以,只是不应该是“用引用变量的地址代替”,而是“用引用变量(本身)代替。
一个指针是一个对象。但一个引用不是一个对象,引用在程序员眼中只是所引用对象的一个“别名”。
既然不是对象,引用也不会被分配储存。“引用”作为一个名字很可能储存在由编译器维护的符号表中。
至于引用在编译器眼中,也就是编译器对于引用的实现方法,最明显的一种是通过“常量指针”来实现,但也不是绝对。 c++的语法便准只是规定了引用的行为特征,但并没有要求各家编译器改如何实现这样的特征。
其实引用和指针并不是在任何情况下都可以相互替换的两种使用形式。比如在处理一些重要的机器地址时就需要直接操纵指针;而运算符重载的参数可以是引用但不能是指针等等……
Top
20 楼ark13(秋分)回复于 2003-08-15 01:18:15 得分 0
c++中的引用和指针在计算机中的表示一样吗?
指针里面存储的是地址!
引用里面也存储的也是地址吗?
针对这样的问题,应该说指针与引用的二进制表现是一样的,指针与引用的区别是编译器行为,是逻辑区别,是由编译器控制和审查的
int func1(int *n)
{
*n=100;
}
int func2(int &n)
{
n=100;
}
int main()
{
int n;
func1(&n);
func2(n);
}
对指针和引用的访问汇编后的代码就已经是一样的了
mov eax,[ebp+0x08]
mov [eax],0x00000064
都由基址寄存器ebp加上指针偏移0x08Top
21 楼tomsx(...)回复于 2003-08-15 01:38:27 得分 0
引用定义的时候要初始化,不然报错,但指针却没有这样的限制(int* ip;),指针本身地址,但引用不同,它和地址联系的更紧密一些,指针本身就有一个地址,所以可以对其进行修改,但引用就不同了,你可以改变引用所对地址里的内容,但你不能改变引用本身。
其实在C++里引用主要用在函数的参数表里,更多的用在copy-construtor里。Top
22 楼Cypher(Nothing)回复于 2003-08-16 17:02:40 得分 0
等你看到汇编指令时,已经看不出任何区别了。严格来说引用类似于常量指针,不过目前C/C++中所谓常量多数是编译期的,也就是编译器检查是否对它进行了修改,真正使用时你用地方去写它是无法控制的。
这个也和所处的操作系统环境有关。Top
23 楼nirvana_li(东成西就,芝兰境界)回复于 2003-08-17 19:56:14 得分 0
引用在计算机中应该是使用指针来实现,它们表现出来的不同是语法层面上的。其实很的书中都有这样的说法。继续关注讨论…………Top




