返回目录:https://blog.csdn.net/chen1083376511/article/details/82723709
+问题:
问:引用与指针有什么区别?
答:
1.引用必须初始化,指针可以不用。
2.引用初始化以后就不能被改变(即只能初始化一次,始终只指向指定的对象),而指针可以改变所指向的对象。
3.不存在指向空值的引用,而指针可以指向一个空值,即空指针。
4.因为引用不能指向空值,这意味着使用引用之前不需要测试其合法性;而指针则需要经常进行测试。所以使用引用的代码效率要比使用指针的效率高,同时也使引用具有更高的安全性。
5.引用不占有内存,而指针是占内存的。
6.引用是单个变量的别名,而指针是个实体。
7.sizeof+引用:引用指向的对象的内存大小。sizeof+指针变量:指针本身的内存大小。
8.引用不存在引用常量,指针存在指针常量。
分析:
void main()
{
int var = 2;
int &reference;//错误,引用不能没有初始化。
int *p;//正确,指针可以不初始化,但是隐含安全性问题,比如由于使用该指针时,它没有指向某个对象,会造成野指针。
int &reference = var;//正确,指向一个对象,即变量。
int &reference = 0;//错误,不能指向空值
int &reference = 2;//错误,引用不能指向常量
//////////////////////////////////////////////////////////////
int *p = 0;//正确,指针可以指向空值
int &reference = *p;//不报错,但是隐含非法,因为p指针是个野指针,当输出p的值(没有指向对象的值)就出错
int &reference = p;//错误,int *类型不能初始化int &类型
int &reference = (int &)p;//强转化类型,与int *无关。
cout << &reference << endl;//&reference 是引用指向变量的地址
cout << reference << endl;//reference 是引用指向变量的值
//////////////////////////////////////////////////////////////
const int &a//是正确的,常引用,表示不能通过常引用来该变指向目标变量的值
int const &a//是错误的,引用常量,由于引用本身一旦初始化就不能被改变,并不需要const来声明。
}
-------------------------------------------------------------------------------------------------------------------------------------------------
问题:
问:下面的代码是否正确?
void main()
{
int b=123;
const int &a=b;
b=555;
printf("%d\n",a);
a=666;
}
答:
void main()
{
int b=123;
const int &a=b;//常引用,即引用指向目标变量的值
b=555;
printf("%d\n",a);//输出结果是555
a=666;//编译错误,不能通过常引用来改变b的值
}
--------------------------------------------------------------------------------------------------------------------------------------------------------
+问题:
问:下面代码是否正确?若不正确,请问哪条语句是错的?
void main()
{
int &a=100;
const int &b=100;
}
答:
void main()
{
int &a=100;//错误
const int &b=100;//正确
const int &b=100//引用指向的是常量,代表的是引用b指向一个const int类型,这个int型的值是不能被改变的。
int &a=100//100是个立即数,由于立即数不是C语言的常量,立即数本身存在于代码段,并不是一个对象或变量,所以引用不能指向它的。
}
--------------------------------------------------------------------------------------------------------------------------------------
问题:
问:下面代码哪条语句是错误的?
void main()
{
const int ci=1024;
const int &rl=ci;
rl=42;
int &r2=ci;
const int &r3=ci;
const int &r4=r3*2;
}
答:
void main()
{
const int ci=1024;
const int &rl=ci;//正确,引用以其对应的对象都是常量
rl=42;//错误,rl是对常量的引用
int &r2=ci;//错误,试图让一个非常引用指向一个常量对象
const int &r3=ci;//正确
const int &r4=r3*2;//正确
//--------------
//1.常量对象不能被非常引用指向
//2.防止通过常引用来改变目标变量(非常量)的值
}
-----------------------------------------------------------------------------------------------------------------------------------------------------
+问题:
问:引用的优势?
答:
1.引用作为函数参数传递时,实际传递的是实参,可直接对实参进行改变。而指针作为函数参数传递时,传递的时实参的地址。根据引用实参的地址来对其进行操作。不管是引用作为函数参数还是其他地方,由于引用是不占用内存并且无须像指针那样还要寻址,节约时间和空间。
2.由于引用一旦定义就必须初始化,还有常引用可以保护指向的目标变量的值不轻易被修改,运用比指针安全。
----------------------------------------------------------------------------------------------------------------------------------------------------
+问题(中兴面试):
问:设void f1(int *m,long &n);int a;long b;则以下调用合法的是()。
A.f1(a,b) B.f1(&a,b)
C.f1(a,&b) D.f1(&a,&b)
答:B
分析:
指针类型的函数参数的作用:将一个变量的地址传送到函数中,调用时,要求实参是一个地址,所以上面的函数,实参前面加取地址符。也可以这样理解:int *m=&a;
引用作为函数参数的作用:形参是变量名的别名,传递数据的作用。调用时,要求实参是一个变量名,所以上面的函数,实参直接使用变量名。也可以这样理解:long &n=b;