【校招面试 之 C++】第13题 C++ 指针和引用的区别

1、指针和引用的定义和性质区别:

(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:

int a=1;int *p=&a;

int a=1;int &b=a;

上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。

而下面2句定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个存储单元。

(2)可以有const指针,但是没有const引用;

(3)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)

(4)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;

(5)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。

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

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

2、指针和引用作为函数参数进行传递时的区别:

(1)传引用和传指针看上去效果一样的,但本质上有区别:指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。

在值传递过程中,被调函数的形式参数作为被调函数的局部变量,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,前面说过,值传递是单向传递(实参->形参),赋值完毕后实参就和形参没有任何联系。那指针传递是怎么通过这个局部变量访问实参的呢,当然是通过局部变量中存储的地址。 
既然形参和实参是相互独立的,在没有任何修饰形参时,形参是可以被修改的,形参指针可以指向任何地方,而且修改后就无法再访问到实参。

(2)而在引用传递过程中,被调函数的形式参数虽然同样作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

引用传递和指针传递是不同的,虽然它们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。而对于指针传递的参数,如果改变被调函数中的指针地址,它将影响不到主调函数的相关变量。

两者都是通过地址来操作值,但是如果改变指针的值(地址),那么实参将不会受到影响(形参为局部变量)。通过编译后,指针和引用无差别。

原文地址:https://www.cnblogs.com/xuelisheng/p/9334971.html

时间: 2024-10-01 21:02:53

【校招面试 之 C++】第13题 C++ 指针和引用的区别的相关文章

Effective C++ .13使用智能指针来引用资源

#include <iostream> #include <cstdlib> #include <memory> using namespace std; class Kiwi { private: int weight; public: Kiwi(int w) : weight(w) {} ~Kiwi() { cout<<"~Kiwi"<<endl; } int getWeight() {return weight;} };

面试问题-指针和引用的区别

C++有几种复合类型,包括常见的两种:引用和指针. 1.引用 使用术语"引用"时,指的其实是"左值引用". 引用类型引用另外一种类型. int ival = 1024; int &refVal = ival;                                         refVal 指向ival int &refVal2;                                                  报错:引用

大公司面试经典数据结构与算法题C#解答

几个大公司(IBM.MicroSoft and so on)面试经典数据结构与算法题C#解答 1.链表反转 我想到了两种比较简单的方法 第一种是需要开一个新的链表,将原链表的元素从后到前的插入到新链表中(也就是原链表第一个元素被插入成新链表的最后一个元素). 第二种是不需要开新的链表,而是逐步反转原链表中元素的指向,例如: 原链表是 1->2->3->4->null  被  逐步修改为 ①2->1->null.3->4->null ②3->2->

js面试中长见的算法题(转载)

js面试中长见的算法题 1.阐述下 JavaScript 中的变量提升 所谓提升,顾名思义即是 JavaScript 会将所有的声明提升到当前作用域的顶部.这也就意味着我们可以在某个变量声明前就使用该变量,不过虽然 JavaScript 会将声明提升到顶部,但是并不会执行真的初始化过程.2.阐述下 use strict; 的作用 use strict; 顾名思义也就是 JavaScript 会在所谓严格模式下执行,其一个主要的优势在于能够强制开发者避免使用未声明的变量.对于老版本的浏览器或者执行

2018百度校招面试总结

2018百度校招面试总结 目前走流程到二面, 写一波面经希望能够收到三面通知, 上天请赐予我运气和力量吧: 校招走流程的两个面试官都很nice, 比较随和, 面试体验非常好; 百度一面 在酒店一楼等面试官通知, 叫到名字就坐电梯去对应房间号面试; 交完简历, 面试官会安静的浏览简历(这时候比较尴尬, 只有静静的等), 然后面试官会让你简单的自我介绍; 面试官后面会对感兴趣的项目进行细节询问, 大致包括: 解决一个什么问题; 项目的背景; 数据处理流程; 大概的项目框架; 自己对整个项目的理解;

第13题:整数转换成罗马数字&amp;第14题:罗马数字转换成整数

写在前面: 这两道题合起来写吧,其实整数转罗马数字我前天就写完了,当我想写罗马数转整数的时候竟然脑子一片空白,想了几分钟就想起来Map,本着学习的目的最终还是不想用Map,坚持C语言,今天脑子里直接涌出了Switch方式转换,看来"蹲在马桶上编程"的方式还是蛮不错的o(^▽^)o 整数转罗马数字:主要建立对应关系,输出时有点像百钱百鸡 罗马数字转整数:输入罗马数字(其实就是字符数组)后,for循环遍历,找出对应,这个再看不懂的建议去看看罗马数字表示方法. 第13题:整数转换成罗马数字

小学奥数读本(三年级),P133第13题

小学奥数读本(三年级),P133第13题. 用一到九,九个数,组成一道除法算式:口口口口×口=口口口口 1 var 2 i,j,k:longint; 3 s:set of 0..9; 4 begin 5 for i:=1234 to 9876 do 6 for j:=2 to 9 do begin 7 s:=[]; 8 s += [j]; 9 k:=i; 10 while(k>0) do begin 11 s += [k mod 10]; 12 k := k div 10; 13 end; 14

第13题:取链表中倒数第K个结点

欢迎转载,转载请务必注明出处:http://blog.csdn.net/alading2009/article/details/45037001 第13题:输入一个单向链表,输出该链表中倒数第K个结点.链表的倒数第0个结点为链表的尾指针. 考虑如何在程序执行中保留K这个信息,这儿使用两个坐标,要让这两个坐标之间相距K个距离,于是当前一个坐标到达尾指针时,后一个坐标恰好与尾相距K个结点距离. 代码 package test013; import test007.Node; /** * Create

[刘阳Java]_美团点评2018届校招面试总结_Java后台开发【转载】

美团喜欢一口气把三轮技术面和HR面一起面完,虽然身心比较累(每一面差不多一个小时),不过也算是一个好事,不像某些公司一天就一面然后让回去等消息,等面试通知也等得让人很焦虑,而且还容易出现面试时间冲突. 一面 1.比较LinkedList.ArrayList的区别,分别适用于什么场景 2.Synchronized关键字和ReentrantLock的区别 3.用过哪些线程池,ThreadPoolExecutor的参数含义 4.什么是悲观锁和乐观锁,乐观锁的实现原理 5.计算机网络中OSI七层模型每一