面试题-指针-引用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chen1083376511/article/details/82703644

返回目录: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;

猜你喜欢

转载自blog.csdn.net/chen1083376511/article/details/82703644
今日推荐