1.从内存上来讲 系统为指针分寸内存空间,而引用与绑定的对象共享内存空间,系统不为引用变量分配内容空间。
2指针初始化以后可以改变指向的对象,而引用定义的时候必须要初始化,且初始化以后不允许再重新绑定对象。
3.所以引用访问对象是直接访问。指针访问对象是间接访问。
4。如果pa是指针,那么*pa就是引用了。
但是两者在作为形参的时候非常相似,区别是指针拷贝副本,引用不拷贝。程序如下:
#include<stdio.h>
void pt(int * pta,int * ptb)
{
int *ptc;
ptc=pta;pta=ptb;ptb=ptc;
}
void ref(int &ra,int &rb)
{
int rc;
rc=ra;ra=rb;rb=rc;
}
void main()
{
int a=3;int b=4;
int *pa=&a;int *pb=&b;
pt(pa,pb);
printf("zhen: a=%d,b=%d\n",a,b);
ref(a,b);
printf("yinyong: a=%d,b=%d\n",a,b);
}
输出结果如下图:
指针和引用本质上只有一点不同:指针可以改变,从而指向不同的对象。引用不能改变,只能指向绑定对象。
另外,引用还有一些指针没有的用法,例如const引用字面值常量而直接绑定栈中常量等。所以,引用应该(个人观点)是作为一种对指针的补充而引入的。
一个最简单的源程序:
int test(int& b, int* c)
{
return 0;
}
int main(int argc, char *argv[])
{
int iA = 0x41;
int &iB = iA;
int *iC = &iA;
test(iB, iC);
return 0;
}
反汇编后的代码:
int iA = 0x41;
00F7DF10 C7 45 E8 41 00 00 00 mov dword ptr [iA],41h
int &iB = iA;
00F7DF17 8D 45 E8 lea eax,[iA]
00F7DF1A 89 45 DC mov dword ptr [iB],eax /*引用也分配了内存,存放iA地址*/
int *iC = &iA;
00F7DF1D 8D 45 E8 lea eax,[iA]
00F7DF20 89 45 D0 mov dword ptr [iC],eax /*指针必然分配内存,存放iA地址*/
test(iB, iC);
00F7DF23 8B 45 D0 mov eax,dword ptr [iC]
00F7DF26 50 push eax /* 指针中存放的iA地址被压入栈*/
00F7DF27 8B 4D DC mov ecx,dword ptr [iB]
test(iB, iC);
00F7DF2A 51 push ecx /*引用中存放的iA地址被压入栈*/
00F7DF2B E8 12 3A FF FF call test (0F71942h)
00F7DF30 83 C4 08 add esp,8
由此可见编译器对指针和引用的处理是完全一样的,唯一的区别是引用不可以再被赋值,而指针则可以。也可以说,非const引用实质上等价于const指针(非const对象的指针),语法上不同而已。
本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。