20.c/c++程序员面试宝典-引用与值传递

原创 2015年11月19日 09:55:54

20.c/c++程序员面试宝典-引用与值传递

c++语言中,函数的参数和返回值的传递方式有3种:引用传递、值传递和指针传递。指针编程者已经在上面进行了介绍,接下来介绍c++中引用和值传递的相关内容。



面试题93  什么是值传递*****


分析:在c++中,值传递是指将要传递的值作为一个副本传递。值传递过程中,被调用函数的形参作为被调用函数的局部变量处理,在内存的堆栈中开辟空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调用函数对形参的任何操作都是作为局部变量进行,不会更改在主调函数的实参变量的值。值传递的示例代码如下:

void Func1(int x)  //参数为值传递的函数

{

x=x+10;

}

...

int n=0;

Func1(n);

cout<<"n="<<n<<endl;


运行结果如下:

n=0


由于Func1函数体内的x采用的是值传递的方式,它只是外部变量n的一个副本,改变x的值不会影响n的值,所以n的值仍然是0。


【答案】值传递将要传递的值作为一个副本传递,在函数调用时,实参把它的值传递给对应的形参,方法执行中形参值的改变不影响实参,实参的值不会发生改变。



面试题94  引用与值传递的区别*****


分析:引用传递传递的是引用对象的内存地址。在地址传递过程中,被调用函数的形参也作为局部变量在堆栈中开辟了空间,但是这时存放的是由主调函数放进去的实参变量的地址。被调用函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。所以,别调用函数对形参做的任何操作都会影响主调函数中的实参变量,引用传递到的示例代码如下:

void Func2(int &x)

{

x=x+10;

}

...

int n=0;

Func2(n);

cout<<"n="<<n<<endl;


结果如下:

n=10

由于Func2()函数体内的x采用的是引用传递的方式,x是外部变量n的引用,x和n表示的是相同的对象,所以改变x也就改变了n,所以n的值更改为10.


引用传递和值传递是面试时考查频率非常高的问题。这个问题比较简单,所以更加需要掌握清楚,不要出现回答错误的情况。


【答案】值传递传递的是一个值的副本。函数对形参的操作不会影响实参的值,而引用传递传递的是引用对象的内存地址,函数对形参的操作会影响实参的值,实参的值将会随着形参值的更改而同样进行更改。



面试题95  指针和引用有什么区别***


分析:指针和引用都是关于地址的概念,指针指向一块内存,它的内容是所指内存的地址。而引用是某块内存的别名。指针是作为一个真正的实体而存在的。


指针的功能非常强大,指针能够毫无约束地操作内存中的任何东西,由于指针功能强大,所以导致它比较危险。如果使用不当的话会对程序运行造成很大的影响,如果一些场合只需要借用一下某个对象的别名,那么就可以使用引用,而避免使用指针,以免发生意外。程序员可以根据程序的需要来灵活选择方案。


【答案】

(1)指针是一个实体,而引用仅仅是个别名;

(2)引用使用时无需解引用(*),指针需要解引用;

(3)引用只能在定义时被初始化一次,之后不可变,指针可以变;

(4)引用没有const,指针可以有const;

(5)引用不能为空,指针可以为空;

(6)“sizeof 引用”得到的是所指向的变量或对象的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;

(7)和引用的自增(++)运用意义不一样;

(8)在内存分配上,程序为指针变量分配内存区域,而引用不需要分配内存区域。


31.c/c++程序员面试宝典-函数参数的传递

31.c/c++程序员面试宝典-函数参数的传递

14.c/c++程序员面试宝典-include的使用

14.c/c++程序员面试宝典-include的使用

24.c/c++程序员面试宝典-多态

24.c/c++程序员面试宝典-多态

C/C++程序员面试宝典-2

9. 关系数据库的范式 10. 数据库操作中的事务 事务的4个特性:   11. 数字矩阵的生成: 对应的代码如下: #include ...

C/C++程序员面试宝典-1

第2部分 C/C++基础知识 1. C++中的基本数据类型: 2. C++中的整型: 3. C++中的常见常量 常量按照数据类型的不同分为整型常量,浮点型常量,字符型常量,还有...

28.c/c++程序员面试宝典-继承时的类作用域

c/c++程序员面试宝典-继承时的类作用域

《Java程序员面试笔试宝典》之Java与C/C++有什么异同

Java与C++都是面向对象语言,都使用了面向对象思想(例如封装、继承、多态等),由于面向对象有许多非常好的特性(继承、组合等),使得二者都有很好的可重用性。        需要注意的是,二者并...

9.c/c++程序员面试宝典-递归

9.c/c++程序员面试宝典-递归

18.c/c++程序员面试宝典-函数指针

18.c/c++程序员面试宝典-函数指针

7.c/c++程序员面试宝典-循环语句

7.c/c++程序员面试宝典-循环语句
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:20.c/c++程序员面试宝典-引用与值传递
举报原因:
原因补充:

(最多只允许输入30个字)