c中引用与指针的区别
C++引用的作用和用法
![C++引用的作用和用法](https://img.taocdn.com/s3/m/61654ada0b4c2e3f56276362.png)
C++ 引用的作用和用法引用的好处之一就是在函数调用时在内存中不会生成副本引用总结(1)在引用的使用中,单纯给某个变量取个别名是毫无意义的,引用的目的主要用于在函数参数传递中,解决大块数据或对象的传递效率和空间不如意的问题。
(2)用引用传递函数的参数,能保证参数传递中不产生副本,提高传递的效率,且通过const的使用,保证了引用传递的安全性。
(3)引用与指针的区别是,指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。
程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。
(4)使用引用的时机。
流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。
引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。
引用的声明方法:类型标识符&引用名=目标变量名;【例1】:int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名(1)&在此不是求地址运算,而是起标识作用。
(2)类型标识符是指目标变量的类型。
(3)声明引用时,必须同时对其进行初始化。
(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。
ra=1; 等价于a=1;(5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。
故:对引用求地址,就是对目标变量求地址。
&ra与&a相等。
(6)不能建立数组的引用。
因为数组是一个由若干个元素所成的集合,所以无法建立一个数组的别名。
(7)不能建立引用的引用,不能建立指向引用的指针。
因为引用不是一种数据类型!!所以没有引用的引用,没有引用的指针。
例如:int n;int &&r=n;//错误,编译系统把"int &"看成一体,把"&r"看成一体,即建立了引用的引用,引用的对象应当是某种数据类型的变量int &*p=n;//错误,编译系统把"int &"看成一体,把" *p "看成一体,即建立了指向引用的指针,指针只能指向某种数据类型的变量(8)值得一提的是,可以建立指针的引用例如:int *p;int *&q=p;//正确,编译系统把" int * "看成一体,把"&q"看成一体,即建立指针p 的引用,亦即给指针p起别名q。
简要陈述指针的优缺点
![简要陈述指针的优缺点](https://img.taocdn.com/s3/m/f558c31b5ef7ba0d4b733bba.png)
简要陈述指针的优缺点C 语言的精华和灵魂是指针,但运用的时候却比较容易出错。
C++ 又引入了“引用的概念,然而在使用过程中很难分清楚它们之间的区别,本文结合编程实例,简单分析了引用和指针的不同之处。
指针和引用看起来完全不同(指针用操作符'*' 和引用使用操作符,但他们似乎都有同样的功能。
指针和引用都是让你对其他对象的实现间接引用。
你如何决定在何时使用指针,在何时使用引用呢?首先,我们必须要认识到在任何情况下都不能使引用的指向为空值。
一个引用必须总是指向某些对象。
因此,如果你定义一个变量并让它指向一个对象,但是该变量在某些时候也可以不指向任何对象,这时你应该把变量声明为指针,因为指针可以为空值。
相反,如果变量必须指向一个对象,例如你的设计不允许变量为空,这时你就应该把变量声明为引用。
一、指针和引用的概念指针其实是一个特殊的变量,它里面存储的本质上是一个内存地址。
弄清指针需要了解指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区°C++ 语言规定可以在程序中定义整型变量、实型变量和字符型变量等,也可以定义一种特殊的变量,专门用于存放变量地址。
通过变量b找到变量a的地址,再根据这个地址找到变量a,这就是我们所说的“间接访问”方式。
由于通过地址能找到所需的变量单元,所以可以说,地址“指向”该变量单元。
一个变量的地址称为该变摇的“指针”。
如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。
引用:引用,一个变量的别名,为什么引入别名呢?原因是我们想定义一个变量,他共享另一个变量的内存空间,使用别名无疑是一个好的选择。
变量是什么?是一个内存空间的名字,如果我们给这个内存空间在起另外一个名字,那就是能够共享这个内存了,引用(别名)的由此而来。
引用的定义方法与定义指针相似,只是用&代替了*。
例如:Point pl(4,4):Point&p2=pl;定义了pl为pl的引用。
c 引用与指针的区别_百度文库.
![c 引用与指针的区别_百度文库.](https://img.taocdn.com/s3/m/ae17d04ba300a6c30c229fd2.png)
★相同点:1. 都是地址的概念;指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。
★区别:1. 指针是一个实体,而引用仅是个别名;2. 引用使用时无需解引用(*),指针需要解引用;3. 引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终” ^_^4. 引用没有 const,指针有 const,const 的指针不可变;5. 引用不能为空,指针可以为空;6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;typeid(T) == typeid(T&)恒为真,sizeof(T) == sizeof(T&)恒为真,但是当引用作为成员时,其占用空间与指针相同(没找到标准的规定)。
7. 指针和引用的自增(++)运算意义不一样;★联系1. 引用在语言内部用指针实现(如何实现?)。
2. 对一般应用而言,把引用理解为指针,不会犯严重语义错误。
引用是操作受限了的指针(仅容许取内容操作)。
引用是C++中的概念,初学者容易把引用和指针混淆一起。
一下程序中,n 是m 的一个引用(reference),m 是被引用物(referent)。
int m;int &n = m;n 相当于m 的别名(绰号),对n 的任何操作就是对m 的操作。
例如有人名叫王小毛,他的绰号是“三毛”。
说“三毛”怎么怎么的,其实就是对王小毛说三道四。
所以n 既不是m 的拷贝,也不是指向m 的指针,其实n 就是m 它自己。
引用的一些规则如下:(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
以下示例程序中,k 被初始化为i 的引用。
语句k = j 并不能将k 修改成为j 的引用,只是把k 的值改变成为6.由于k 是i 的引用,所以i 的值也变成了6.int i = 5;int j = 6;int &k = i;k = j; // k 和i 的值都变成了6;上面的程序看起来象在玩文字游戏,没有体现出引用的价值。
理解C语言(一)数组、函数与指针
![理解C语言(一)数组、函数与指针](https://img.taocdn.com/s3/m/3db692fe5ff7ba0d4a7302768e9951e79b896967.png)
理解C语⾔(⼀)数组、函数与指针1 指针⼀般地,计算机内存的每个位置都由⼀个地址标识,在C语⾔中我们⽤指针表⽰内存地址。
指针变量的值实际上就是内存地址,⽽指针变量所指向的内容则是该内存地址存储的内容,这是通过解引⽤指针获得。
声明⼀个指针变量并不会⾃动分配任何内存。
在对指针进⾏间接访问前,指针必须初始化: 要么指向它现有的内存,要么给它分配动态内存。
对未初始化的指针变量执⾏解引⽤操作是⾮法的,⽽且这种错误常常难以检测,其结果往往是⼀个不相关的值被修改,并且这种错误很难调试,因⽽我们需要明确强调: 未初始化的指针是⽆效的,直到该指针赋值后,才可使⽤它。
int *a;*a=12; //只是声明了变量a,但从未对它初始化,因⽽我们没办法预测值12将存储在什么地⽅int *d=0; //这是可以的,0可以视作为零值int b=12;int *c=&b;另外C标准定义了NULL指针,它作为⼀个特殊的指针常量,表⽰不指向任何位置,因⽽对⼀个NULL指针进⾏解引⽤操作同样也是⾮法的。
因⽽在对指针进⾏解引⽤操作的所有情形前,如常规赋值、指针作为函数的参数,⾸先必须检查指针的合法性- ⾮NULL指针。
解引⽤NULL指针操作的后果因编译器⽽异,两个常见的后果分别是返回置0的值及终⽌程序。
总结下来,不论你的机器对解引⽤NULL指针这种⾏为作何反应,对所有的指针变量进⾏显式的初始化是种好做法。
如果知道指针被初始化为什么地址,就该把它初始化为该地址,否则初始化为NULL在所有指针解引⽤操作前都要对其进⾏合法性检查,判断是否为NULL指针,这是⼀种良好安全的编程风格1.1 指针运算基础在指针值上可以进⾏有限的算术运算和关系运算。
合法的运算具体包括以下⼏种: 指针与整数的加减(包括指针的⾃增和⾃减)、同类型指针间的⽐较、同类型的指针相减。
例如⼀个指针加上或减去⼀个整型值,⽐较两指针是否相等或不相等,但是这两种运算只有作⽤于同⼀个数组中才可以预测。
计算机专业研究生复试-C语言程序设计面试简答题
![计算机专业研究生复试-C语言程序设计面试简答题](https://img.taocdn.com/s3/m/d8bc4f771fd9ad51f01dc281e53a580216fc50ca.png)
C语言程序设计1.简述C语⾔采取了哪些措施提⾔执⾔效率●使⽤指针:有些程序⽤其他语⽤也可以实现,但C能够更有效地实现;有些程序⽤法⽤其它语⽤实现,如直接访问硬件,但C却可以。
正因为指针可以拥有类似于汇编的寻址⽤式,所以可以使程序更⽤效。
●使⽤宏函数:宏函数仅仅作为预先写好的代码嵌⽤到当前程序,不会产⽤函数调⽤,所以仅仅是占⽤了空间,⽤使程序可以⽤效运⽤。
在频繁调⽤同⽤个宏函数的时候,该现象尤其突出。
函数和宏函数的区别就在于,宏函数占⽤了⽤量的空间,⽤函数占⽤了时间。
●使⽤位操作:位操作可以减少除法和取模的运算。
在计算机程序中数据的位是可以操作的最⽤数据单位,理论上可以⽤"位运算"来完成所有的运算和操作。
灵活的位操作可以有效地提⽤程序运⽤的效率。
●将汇编指令嵌⽤到C 语⽤程序中,汇编语⽤是效率最⽤的计算机语⽤,因此在C语⽤程序中嵌⽤汇编,从⽤充分利⽤⽤级语⽤和汇编语⽤各⽤的特点。
●系统调用:在C语⽤程序中可以调⽤操作系统级的API,从⽤提⽤程序的运⽤效率。
●条件编译:C语⽤源程序中加上条件编译,让编译器只对满⽤条件的代码进⽤编译,将不满⽤条件的代码舍弃,可以减少编译及执行程序代码量。
●循环嵌套中将较长循环设为内置循环,较短循环设为外置循环,以减少cpu跨切循环层的次数,提⽤程序的运⽤效率。
(操作系统页⽤置换相关,减少页⽤置换次数)●其它诸如寄存器变量、联合体、编译器优化等手段提⽤执⽤效率。
2.if…else和switch区别总结:都是条件选中语句。
但switch语句只能取代if语句的一部分功能。
●比较的范围不同:if 语句可做各种关系比较(只要是boolean 表达式都可以用if 判断)switch语句只能做等式比较,即只能对基本类型进行数值比较。
(switch只能做几个数据类型的等式比较,实现非等式效率低,)switch之后括号内的表达式只能是整型(byte、short、char和int)、枚举型或字符型表达式,不能是长整型或其他任何类型。
引用传递与指针传递区别
![引用传递与指针传递区别](https://img.taocdn.com/s3/m/59d28f6958fafab069dc02d6.png)
C++中引用传递与指针传递区别在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的:指针传递参数本质上是值传递的方式,它所传递的是一个地址值。
值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。
值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。
(这里是在说实参指针本身的地址值不会变)而在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。
被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。
正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
引用传递和指针传递是不同的,虽然它们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。
而对于指针传递的参数,如果改变被调函数中的指针地址,它将影响不到主调函数的相关变量。
如果想通过指针参数传递来改变主调函数中的相关变量,那就得使用指向指针的指针,或者指针引用。
为了进一步加深大家对指针和引用的区别,下面我从编译的角度来阐述它们之间的区别:程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。
指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。
符号表生成后就不会再改,因此指针可以改变其指向的对象(指针变量中的值可以改),而引用对象则不能修改。
最后,总结一下指针和引用的相同点和不同点:★相同点:●都是地址的概念;指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。
★不同点:●指针是一个实体,而引用仅是个别名;●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;●引用没有const,指针有const,const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有的,前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变)●引用不能为空,指针可以为空;●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;typeid(T)== typeid(T&)恒为真,sizeof(T)==sizeof(T&)恒为真,但是当引用作为成员时,其占用空间与指针相同(没找到标准的规定)●指针和引用的自增(++)运算意义不一样;●引用是类型安全的,而指针不是,引用比指针多了类型检查★联系1. 引用在语言内部用指针实现(如何实现?)。
C-C++mst01
![C-C++mst01](https://img.taocdn.com/s3/m/6dba481fc5da50e2524d7fe8.png)
一、static有什么用途?(请至少说明两种)答:1.限制变量的作用域 2.设置变量的存储域二、C++中引用和指针的区别:答:1 、要认识到在任何情况下都不能使用指向空值的引用。
一个引用必须总是指向某些对象,因为引用肯定会指向一个对象,在C++里,引用应被初始化。
指针没有这样的限制,不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。
因为在使用引用之前不需要测试它的合法性。
例如:void printDouble(const double& rd){cout << rd; // 不需要测试rd,它肯定指向一个double值}相反,指针则应该总是被测试,防止其为空:void printDouble(const double *pd){if (pd){ // 检查是否为NULLcout << *pd;}}2 、指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象,引用则总是指向在初始化时被指定的对象,以后不能改变。
string s1="John";string s2="Billy";string &rs=s1;//rs引用s1string *ps=s1;//ps指向s1rs=s2;//rs仍引用s1,但此时s1的值为"Billy"ps=s2;//ps指向s2,但s1此时的值没有发生改变3、引用只是个变量的别名不占用存储空间指针是个变量占用存储空间三、描述实时系统的基本特性答:在特定时间内完成特定的任务,实时性与可靠性。
四、全局变量和局部变量在内存中是否有区别?如果有,是什么区别?答:全局变量储存在静态数据区,局部变量在堆栈中。
(预备知识—程序的内存分配一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。
C语言和C++的区别
![C语言和C++的区别](https://img.taocdn.com/s3/m/0ad73d3ba4e9856a561252d380eb6294dc882255.png)
C语言和C++的区别C语言和C++的区别精选C和C++的关系:就像是win98跟winXP的关系。
C++是在C 的基础上增加了新的理论,玩出了新的花样。
所以叫C加加。
以下是店铺为大家收集的C语言和C++的区别精选,欢迎大家借鉴与参考,希望对大家有所帮助。
C语言和C++的区别1C是一个结构化语言,它的重点在于算法和数据结构。
C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。
C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。
所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。
之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中”。
下面我们一步一步来分析C++与C的不同:一、类,类对于初学者,它是一个累赘。
类的封装使得初学者对程序产生厌倦,感到不适和麻烦。
二、引用,引用是C++中最好尽量不要用它,除非万不得已。
引用对于初学者就更容易产生混淆,不知道哪个是引用,哪个是变量。
三、函数的重载,初学者学函数的重载好像没什么坏处,但是,这会使初学者潜意识里对C语言的变量类型的重要性产生淡化,要记住C语言是对变量类型最敏感了的,变量的类型在C语言里的重要性是不言而喻的。
四、流操作符,和上面同样的道理,使得对变量类型的重要性产生淡化,有时会产生使初学者莫名其妙的结果。
五、操作符重载,典型的高级应用,初学者可能根本用不着,这个东东会让他们觉得C++很难,门槛高,看不懂。
六、继承,以及虚函数,看起来深奥,实用价值很低。
还有些东东我就不发表评论了,如:new,操作符等七、误区:以问答形式:问:C++是面向对象化的而C是面向过程化的?答:第二对,第一问错,C++并非完全面向对象化,真正的面向对象化的语言恐怕只有Java才算得上。
问:C++能实现C所不能的功能吗?答:至少我还没有发现问:学了C再学C++有障碍吗?比如程序设计思想答:至少我还没有看见谁有此症状。
c语言中的引用
![c语言中的引用](https://img.taocdn.com/s3/m/78283189680203d8ce2f24ca.png)
public:
Set () {card=0;} //构造函数
friend Set operator * (Set ,Set ) ; //重载运算符号*,用于计算集合的交集 用对象作为传值参数
// friend Set operator * (Set & ,Set & ) 重载运算符号*,用于计算集合的交集 用对象的引用作为传值参数
当大型对象被传递给函数时,使用引用参数可使参数传递效率得到提高,因为引用并不产生对象的
副本,也就是参数传递时,对象无须复制。下面的例子定义了一个有限整数集合的类:
const maxCard=100;
Class Set
{
int elems[maxCard]最大值。
void swapint(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
调用该函数的c++方法为:swapint(x,y); c++自动把x,y的地址作为参数传递给swapint函数。
2、给函数传递大型对象
{
res.elems[res.card++]=Set1.elems;
break;
}
return res;
}
由于重载运算符不能对指针单独操作,我们必须把运算数声明为 Set 类型而不是 Set * 。
每次使用*做交集运算时,整个集合都被复制,这样效率很低。我们可以用引用来避免这种情况。
c语言中的引用2009-02-09 13:00
C++基础面真题
![C++基础面真题](https://img.taocdn.com/s3/m/94bdf8280166f5335a8102d276a20029bd64633d.png)
1.const符号常量:〔1〕、const char Xp〔2〕、char const Xp〔3〕、char X const p如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量。
如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
2.析构函数和虚函数的用法和作用?析构函数的作用是当对象生命期结束时释放对象所占用的资源。
析构函数用法:析构函数是特别的类成员函数它的名字和类名相同,没有返回值,没有参数不能随意调用也没有重载。
只是在类对象生命期结束时有系统自动调用。
虚函数用在继承中,当在派生类中需要重新定义基类的函数时需要在基类中将该函数声明为虚函数,作用为使程序支持动态联遍。
3.堆和栈的区别栈〔stack〕:由编译器自动分配释放,存放函数的参数值,局部变量的值等。
其操作方法类似于数据结构中的栈。
堆:一般由程序员分配释放,假设不释放,程序结束时可能由OS回收。
注意它与数据结构中的堆是两回事,分成分法类似。
4.头文件的作用是什么?1.通过头文件来调用库功能。
在很多场合,源代码不便〔或不准〕向用户公布,只要向用户提供头文件和二进制的库即可。
用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么完成的。
编译器会从库中提取出相应的代码。
2.头文件能加强类型平安检查。
如果某个接口被完成或被使用时,其方法与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。
5.内存的分成分法有几种?1.从静态存储地域分配。
内存在程序编译的时候已经分配好,这块内存在程序的整个运行期间都存在。
如全局变量。
2.在栈上创立。
在执行函数时,函数内局部变量的存储单元都可以在栈上创立,函数执行结束时这些存储单元自动被释放。
栈内存分配运算内置于处理器的指令集中,效率高,但是分配的内存容量有限。
3.从堆上分配,亦称动态内存分配。
程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。
c语言面试题集(完整版)
![c语言面试题集(完整版)](https://img.taocdn.com/s3/m/f6aeb788680203d8ce2f244f.png)
c语言面试题集(完整版)试题1:C语言面试题一——华为篇1.static有什么用途?(请至少说明两种)1)限制变量的作用域2)设置变量的存储域(堆,主动分配内存也是堆)2.引用与指针有什么区别?1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。
3) 不存在指向空值的引用,但是存在指向空值的指针。
3.描述实时系统的基本特性在特定时间内完成特定的任务,实时性与可靠性4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?全局变量储存在静态数据库,局部变量在栈5.什么是平衡二叉树?左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于16.堆栈溢出一般是由什么原因导致的?没有回收垃圾资源7.什么函数不能声明为虚函数?constructor (构造函数)8.冒泡排序算法的时间复杂度是什么?(其它排序算法的时间复杂度) O(n^2)9.写出float x 与“零值”比较的if语句。
if(x>0.000001&&x<-0.000001)10.Internet采用哪种网络协议?该协议的主要层次结构?tcp/ip 应用层/传输层/网络层/数据链路层/物理层11.Internet物理地址和IP地址转换采用什么协议?ARP (Address Resolution Protocol)(地址解析協議)18.IP地址的编码分为哪俩部分?IP地址由两部分组成,网络号和主机号。
不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。
19.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。
写出C程序。
循环链表,用取余操作做#include <stdio.h>#define NULL 0#define TYPE struct stu#define LEN sizeof (struct stu)struct stu{int data;struct stu *next;};TYPE *line(int n){int sum=1;struct stu *head,*pf,*pb;int i;for(i=0;i<n;i++){pb=(TYPE*) malloc(LEN);pb->data=sum;if (i==0)pf=head=pb;elsepf->next=pb;if (i==(n-1))pb->next=head;else pb->next=NULL;pf=pb;sum++;}return(head);}main(){int M,N,x,i;struct stu *p,*q;printf("please scanf M and N (M<N)");scanf("%d %d",&M,&N);p=line(N);x=N;while(x){for(i=1;i<M-1;i++){p=p->next;}q=p->next;printf("%d\n",q->data) ;p->next = p->next->next;p=p->next;free(q) ;x--;}getch();}20.不能做switch()的参数类型是:switch的参数不能为实型。
C++基础
![C++基础](https://img.taocdn.com/s3/m/151959b8f121dd36a32d8240.png)
C++基础1.new、delete、malloc、free关系delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。
malloc 与free是C++/C语言的标准库函数,new/delete是C++的运算符。
它们都可用于申请动态内存和释放内存。
对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。
对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。
由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。
注意new/delete不是库函数。
2.delete与delete []区别delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。
在More Effective C++中有更为详细的解释:―当delete操作符用于数组时,它为每个数组元素调用析构函数,然后调用operatordelete来释放内存。
‖delete与New配套,delete []与new []配套MemTest*mTest1=newMemTest[10];MemTest*mTest2=newMemTest;int*pInt1=newint[10];int*pInt2=newint;delete[]pInt1; //-1-delete[]pInt2; //-2-delete[]mTest1;//-3-delete[]mTest2;//-4-在-4-处报错。
这就说明:对于内建简单数据类型,delete和delete[]功能是相同的。
对于自定义的复杂数据类型,delete和delete[]不能互用。
delete[]删除一个数组,delete删除一个指针简单来说,用new分配的内存用delete删除用new[]分配的内存用delete[] 删除delete[]会调用数组元素的析构函数。
动态创建二维vector数组C和C++及指针与引用的区别
![动态创建二维vector数组C和C++及指针与引用的区别](https://img.taocdn.com/s3/m/c0620df6760bf78a6529647d27284b73f2423602.png)
动态创建⼆维vector数组C和C++及指针与引⽤的区别⼆维vectorvector<vector <int> > ivec(m ,vector<int>(n)); //m*n的⼆维vector动态创建m*n的⼆维vector⽅法⼀:vector<vector <int> > ivec;ivec.resize(m);for(int i=0;i<m;i++) ivec[i].resize(n);⽅法⼆:vector<vector <int> > ivec;ivec.resize(m,vector<int>(n));动态创建⼆维数组a[m][n]C语⾔版:#include<malloc.h>int **a=(int **)malloc(m*sizeof(int *));for(int i=0;i<m;i++)a[i]=(int *)malloc(n*sizeof(int));C++版:int **a=new int*[m];for(int i=0;i<m;i++) a[i]=new int[n];初始化⼆维数组vector<vector <int> > ivec(m ,vector<int>(n,0)); //m*n的⼆维vector,所有元素为0C++中⽤new动态创建⼆维数组的格式⼀般是这样:TYPE (*p)[N] = new TYPE [][N];其中,TYPE是某种类型,N是⼆维数组的列数。
采⽤这种格式,列数必须指出,⽽⾏数⽆需指定。
在这⾥,p的类型是TYPE*[N],即是指向⼀个有N列元素数组的指针。
还有⼀种⽅法,可以不指定数组的列数:int **p;p = new int*[10]; //注意,int*[10]表⽰⼀个有10个元素的指针数组for (int i = 0; i != 10; ++i){p[i] = new int[5];}这⾥是将p作为⼀个指向指针的指针,它指向⼀个包含10个元素的指针数组,并且每个元素指向⼀个有5个元素的数组,这样就构建了⼀个10⾏5列的数组。
c语言中的指针是什么
![c语言中的指针是什么](https://img.taocdn.com/s3/m/221db1f4b9f67c1cfad6195f312b3169a551ea42.png)
c语言中的指针是什么很多学习C语言的新手来说,指针无疑是一个难点。
但是,我觉得指针也是C语言特别重要的一个特性。
那么下面一起来看看店铺为大家精心推荐的c语言中的指针是什么,希望能够对您有所帮助。
为什么说指针是 C 语言的精髓?“指”是什么意思?其实完全可以理解为指示的意思。
比如,有一个物体,我们称之为A。
正是这个物体,有了这么个称谓,我们才能够进行脱离这个物体的实体而进行一系列的交流。
将一个物体的指示,是对这个物体的抽象。
有了这种抽象能力,才有所谓的智慧和文明。
所以这就是“指示”这种抽象方法的威力。
退化到C语言的指针,指针是一段数据/指令(在冯诺易曼体系中,二者是相通,在同一空间中的)的指示。
这是指示,也就是这段数据/指令的起始位置。
但是数据/代码是需要一个解释的方法的。
比如0x0001,可以作为一个整数,也可以作为作为一串指令,也可以作为一串字符,总之怎样解释都可以。
而C语言,在编译阶段,确定了这段数据/指令的“解释方法”。
例如,整型指针,表示的就是可以从这个指针p指向的位置开始解释,解释为一个整数。
一个函数指针,表示的就是可以从这个指针p指向的位置开始解释,解释为一段指令,对应的输入和输出以及返回值按照函数指针的类型,符合相应的要求。
综上,C语言的精髓是指针,但指针不仅仅是C语言的精髓,它是抽象的精髓。
各个语言中都有类似的东西,例如函数,例如引用。
(引用和指针的区别,我的理解,不可以进行+/-偏移操作的指针,就是引用。
随意偏移,很容易使得目标位置不符合其相应的意义,从而造成解释失败,进而崩溃。
而增加了偏移功能的指针,好处是方便表述一堆具有相同类型的数据/指令,数组之类的就是这样的实例。
) 同样的void类型的指针,也是C语言的特色。
void型的指针,就是去掉了指定类型的指针,从而使得可以以任意解释方式,解释指针,这就带来了如上的潜在问题。
但是也可以说,这个C语言的特有威力(我一般都把C语言的威力理解为这个)。
c语言工程师面试题及答案
![c语言工程师面试题及答案](https://img.taocdn.com/s3/m/af6a33e86429647d27284b73f242336c1eb93095.png)
c语言工程师面试题及答案1. 题目:请解释C语言中的指针和引用的区别。
答案:在C语言中,指针是一个变量,它存储了另一个变量的内存地址。
指针可以被重新赋值指向不同的内存地址,而引用是C++中的概念,它是一个别名,它与原始变量共享内存地址,不能被重新赋值。
2. 题目:描述C语言中的结构体(struct)及其用途。
答案:结构体是C语言中一种用户自定义的数据类型,它允许将不同的数据类型组合成一个单一的数据结构。
结构体的用途包括创建复杂的数据类型,如员工记录、学生信息等,以便于数据管理。
3. 题目:解释C语言中全局变量和局部变量的区别。
答案:全局变量是在函数外部定义的变量,它在整个程序中都可以访问。
局部变量是在函数内部定义的变量,它只能在定义它的函数内部访问。
4. 题目:请举例说明C语言中的递归函数。
答案:递归函数是一个调用自身的函数。
例如,计算阶乘的函数就是一个递归函数:```cint factorial(int n) {if (n == 0) return 1;else return n * factorial(n - 1);}```5. 题目:什么是C语言中的预处理器指令,它们有什么作用?答案:预处理器指令是C语言中的特殊指令,它们在编译之前处理源代码。
常见的预处理器指令包括`#include`(包含头文件)、`#define`(定义宏)、`#ifdef`、`#ifndef`、`#endif`(条件编译)等。
它们的作用包括代码的模块化、代码的复用、条件编译等。
6. 题目:解释C语言中的内存分配方式。
答案: C语言中的内存分配方式主要有三种:静态分配(编译时分配)、动态分配(运行时分配,使用`malloc`、`calloc`、`realloc`函数)和栈分配(局部变量的分配方式)。
7. 题目:如何在C语言中实现文件的读写操作?答案:在C语言中,可以使用`fopen`函数打开文件,`fprintf`、`fscanf`函数进行文件的写入和读取,`fclose`函数关闭文件。
c中引用的作用
![c中引用的作用](https://img.taocdn.com/s3/m/2bb42a4f00f69e3143323968011ca300a6c3f6a3.png)
c中引用的作用引言在C语言中,引用是一种非常重要的概念。
它可以用来在程序中传递数据,减少内存的使用,提高程序的效率等。
本文将详细介绍C语言中引用的作用,并探讨其在不同场景下的应用。
什么是引用引用是C语言中的一种数据类型,它允许程序员在程序中使用一个变量的别名。
通过引用,我们可以直接访问变量的地址,而不需要通过变量名来访问。
引用使用符号”&“来声明,并且必须在声明时进行初始化。
引用的作用引用在C语言中有多种作用,下面将详细介绍几种常见的应用场景。
1. 传递参数在函数调用中,如果我们想要修改传入的参数的值,可以使用引用。
通过将参数声明为引用类型,函数可以直接修改传入参数的值,而不需要返回值。
这样可以减少内存的使用,提高程序的效率。
下面是一个示例:void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;}int main() {int x = 10;int y = 20;swap(&x, &y);printf("x = %d, y = %d\n", x, y);return 0;}在上面的代码中,我们定义了一个swap函数,它接受两个参数的指针,并交换它们的值。
通过传递参数的引用,我们可以直接修改变量的值,而不需要通过返回值来实现。
2. 减少内存的使用在C语言中,变量的传递通常是通过值传递的方式。
这意味着函数在调用时会创建变量的副本,并在函数调用结束后销毁。
如果变量的大小较大,或者需要频繁地进行传递,这将导致内存的浪费。
通过使用引用,我们可以避免创建副本,减少内存的使用。
3. 实现数据结构在C语言中,我们经常需要实现各种数据结构,如链表、树等。
使用引用可以方便地操作这些数据结构。
通过引用,我们可以直接访问数据结构的节点,而不需要通过指针或其他方式来访问。
4. 提高程序的效率在一些特定的场景下,使用引用可以提高程序的效率。
c和c++的区别
![c和c++的区别](https://img.taocdn.com/s3/m/809cc87eb94ae45c3b3567ec102de2bd9605decd.png)
c和c++的区别1、C和C++的区别1)C是⾯向过程的语⾔,是⼀个结构化的语⾔,考虑如何通过⼀个过程对输⼊进⾏处理得到输出;C++是⾯向对象的语⾔,主要特征是“封装、继承和多态”。
封装隐藏了实现细节,使得代码模块化;派⽣类可以继承⽗类的数据和⽅法,扩展了已经存在的模块,实现了代码重⽤;多态则是“⼀个接⼝,多种实现”,通过派⽣类重写⽗类的虚函数,实现了接⼝的重⽤。
2)C和C++动态管理内存的⽅法不⼀样,C是使⽤malloc/free,⽽C++除此之外还有new/delete关键字。
3)C++⽀持函数重载,C不⽀持函数重载4)C++中有引⽤,C中不存在引⽤的概念2、C++中指针和引⽤的区别1)指针是⼀个新的变量,存储了另⼀个变量的地址,我们可以通过访问这个地址来修改另⼀个变量;引⽤只是⼀个别名,还是变量本⾝,对引⽤的任何操作就是对变量本⾝进⾏操作,以达到修改变量的⽬的2)引⽤只有⼀级,⽽指针可以有多级3)指针传参的时候,还是值传递,指针本⾝的值不可以修改,需要通过解引⽤才能对指向的对象进⾏操作引⽤传参的时候,传进来的就是变量本⾝,因此变量可以被修改3、结构体struct和共同体union(联合)的区别结构体:将不同类型的数据组合成⼀个整体,是⾃定义类型共同体:不同类型的⼏个变量共同占⽤⼀段内存1)结构体中的每个成员都有⾃⼰独⽴的地址,它们是同时存在的;共同体中的所有成员占⽤同⼀段内存,它们不能同时存在;2)sizeof(struct)是内存对齐后所有成员长度的总和,sizeof(union)是内存对齐后最长数据成员的长度、4、#define和const的区别1)#define定义的常量没有类型,所给出的是⼀个⽴即数;const定义的常量有类型名字,存放在静态区域2)处理阶段不同,#define定义的宏变量在预处理时进⾏替换,可能有多个拷贝,const所定义的变量在编译时确定其值,只有⼀个拷贝。
3)#define定义的常量是不可以⽤指针去指向,const定义的常量可以⽤指针去指向该常量的地址4)#define可以定义简单的函数,const不可以定义函数5、重载overload,覆盖override,重写overwrite,这三者之间的区别1)overload,将语义相近的⼏个函数⽤同⼀个名字表⽰,但是参数和返回值不同,这就是函数重载特征:相同范围(同⼀个类中)、函数名字相同、参数不同、virtual关键字可有可⽆2)override,派⽣类覆盖基类的虚函数,实现接⼝的重⽤特征:不同范围(基类和派⽣类)、函数名字相同、参数相同、基类中必须有virtual关键字(必须是虚函数)3)overwrite,派⽣类屏蔽了其同名的基类函数特征:不同范围(基类和派⽣类)、函数名字相同、参数不同或者参数相同且⽆virtual关键字7、delete和delete[]的区别delete只会调⽤⼀次析构函数,⽽delete[]会调⽤每个成员的析构函数⽤new分配的内存⽤delete释放,⽤new[]分配的内存⽤delete[]释放8、STL库⽤过吗?常见的STL容器有哪些?算法⽤过⼏个?STL包括两部分内容:容器和算法容器即存放数据的地⽅,⽐如array, vector,分为两类,序列式容器和关联式容器序列式容器,其中的元素不⼀定有序,但是都可以被排序,⽐如vector,list,queue,stack,heap, priority-queue, slist关联式容器,内部结构是⼀个平衡⼆叉树,每个元素都有⼀个键值和⼀个实值,⽐如map, set, hashtable, hash_set算法有排序,复制等,以及各个容器特定的算法迭代器是STL的精髓,迭代器提供了⼀种⽅法,使得它能够按照顺序访问某个容器所含的各个元素,但⽆需暴露该容器的内部结构,它将容器和算法分开,让⼆者独⽴设计。
c 用指针代替引用的方法
![c 用指针代替引用的方法](https://img.taocdn.com/s3/m/97db2655a66e58fafab069dc5022aaea998f413f.png)
c 用指针代替引用的方法【引言】在编程过程中,指针和引用是两种常见的数据操作方式。
然而,许多人对这两种方式存在混淆,尤其是在C++中,引用和指针的语法相似。
本文将阐述用指针代替引用的方法,帮助读者更好地理解和使用这两种操作方式。
【指针与引用的概念区分】首先,我们需要明确指针和引用的概念。
引用是一种更高级的数据类型,它允许程序员在声明变量时为其赋予一个已存在的变量值。
引用相当于一个别名,它与原变量共享内存空间。
而指针是存储变量内存地址的一种数据类型。
【为何使用指针代替引用】虽然在某些情况下,引用是一种方便的操作方式,但指针在某些方面具有优势。
以下是一些使用指针代替引用的原因:1.动态内存分配:在使用动态内存分配时,指针可以方便地处理内存的释放和重新分配。
而引用在动态内存分配中作用有限。
2.操作复杂数据结构:处理链表、树等复杂数据结构时,指针可以方便地实现节点之间的链接。
而引用在这些情况下操作起来较为繁琐。
3.函数参数传递:使用指针作为函数参数,可以实现对实参的修改。
而引用在函数内部无法直接修改实参,需要借助指针来实现。
【指针操作实例】以下是一个使用指针操作的实例:```c#include <stdio.h>void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;}int main() {int x = 10;int y = 20;printf("Before swap: x = %d, y = %d", x, y);swap(&x, &y);printf("After swap: x = %d, y = %d", x, y);return 0;}```在这个例子中,我们使用指针来修改变量x和y的值。
【指针使用注意事项】1.避免野指针:使用指针时,确保指针始终指向有效的内存地址,避免指向已释放或无效的内存地址。
C语言笔试题_C笔试题大全14_附答案
![C语言笔试题_C笔试题大全14_附答案](https://img.taocdn.com/s3/m/4e3ef7cb6394dd88d0d233d4b14e852459fb395c.png)
C语言笔试题_C笔试题大全14_附答案c语言常见笔试题总结【1 使用宏】1.1 #error的作用?#error用于向编译器报错,并输出它后面带的错误信息。
例如:#ifndef SOMETHING#error SOMETHING not defined!#endif如果在这段代码之前未定义过SOMETHING,则在编译时出错,并给出"SOMETHING not defined!"的错误信息。
1.2 定义一个宏,求出给定数组中的元素的个数#define NELEMENTS(array) (sizeof(array) / sizeof((array)[0])) 【2 数据声明和定义】给定以下类型的变量a的定义式:a) An integerint a;b) A pointer to an integerint *a;c) A pointer to a pointer to an integerint **a;d) An array of 10 integersint a[10];e) An array of 10 pointers to integersint *a[10];f) A pointer to an array of 10 integersint (*a)[10];g) A pointer to a function that takes an integer as an argument and returns an integerint (*a)(int );h) An array of ten pointers to function s that take an integer argument and return an integeri nt (*a[10] ) (int );【3 复杂类型(1)】有如下表达式:char (*(*x())[])();请用文字描述x是什么。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C++中引用与指针的区别(详细介绍)C++中的引用与指针的区别指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过void*指针操作对象必须进行类型转化。
★相同点:1.都是地址的概念;指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。
★区别:1.指针是一个实体,而引用仅是个别名;2.引用使用时无需解引用(*),指针需要解引用;3.引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终” ^_^4.引用没有const,指针有const,const的指针不可变;5.引用不能为空,指针可以为空;6. “sizeof引用”得到的是所指向的变量(对象)的大小,而“sizeof指针”得到的是指针本身(所指向的变量或对象的地址)的大小;typeid(T)== typeid(T&)恒为真,sizeof(T)== sizeof(T&)恒为真,但是当引用作为类成员名称时,其占用空间与指针相同4个字节(没找到标准的规定)。
7.指针和引用的自增(++)运算意义不一样;★联系1.引用在语言内部用指针实现(如何实现?)。
2.对一般应用而言,把引用理解为指针,不会犯严重语义错误。
引用是操作受限了的指针(仅容许取内容操作)。
引用是C++中的概念,初学者容易把引用和指针混淆一起。
一下程序中,n 是m的一个引用(reference),m是被引用物(referent)。
int m;int &n = m;n相当于m的别名(绰号),对n的任何操作就是对m的操作。
例如有人名叫王小毛,他的绰号是“三毛”。
说“三毛”怎么怎么的,其实就是对王小毛说三道四。
所以n既不是m的拷贝,也不是指向m的指针,其实n就是m它自己。
引用的一些规则如下:(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
以下示例程序中,k被初始化为i的引用。
语句k = j并不能将k修改成为j 的引用,只是把k的值改变成为6.由于k是i的引用,所以i的值也变成了6.int i = 5;int j = 6;int &k = i;k = j;// k和i的值都变成了6;上面的程序看起来象在玩文字游戏,没有体现出引用的价值。
引用的主要功能是传递函数的参数和返回值。
C++语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。
1)以下是“值传递”的示例程序。
由于Func1函数体内的x是外部变量n的一份拷贝,改变x的值不会影响n,所以n的值仍然是0.void Func1(int x){x = x + 10;}int n = 0;Func1(n);cout << “n = ” << n << endl;// n = 02)以下是“指针传递”的示例程序。
由于Func2函数体内的x是指向外部变量n的指针,改变该指针的内容将导致n的值改变,所以n的值成为10.void Func2(int *x){(* x) = (* x) + 10;}⋯int n = 0;Func2(cout << “n = ” << n << endl; // n = 103)以下是“引用传递”的示例程序。
由于Func3函数体内的x是外部变量n的引用,x和n是同一个东西,改变x等于改变n,所以n的值成为10.void Func3(int &x){x = x + 10;}⋯int n = 0;Func3(n);cout << “n = ” << n << endl; // n = 10对比上述三个示例程序,会发现“引用传递”的性质象“指针传递”,而书写方式象“值传递”。
实际上“引用”可以做的任何事情“指针”也都能够做,为什么还要“引用”这东西?答案是“用适当的工具做恰如其分的工作”。
指针能够毫无约束地操作内存中的如何东西,尽管指针功能强大,但是非常危险。
就象一把刀,它可以用来砍树、裁纸、修指甲、理发等等,谁敢这样用?如果的确只需要借用一下某个对象的“别名”,那么就用“引用”,而不要用“指针”,以免发生意外。
比如说,某人需要一份证明,本来在文件上盖上公章的印子就行了,如果把取公章的钥匙交给他,那么他就获得了不该有的权利。
——————————摘自「高质量c++编程」指针与引用,在More Effective C++的条款一有详细讲述,我给你转过来条款一:指针与引用的区别指针与引用看上去完全不同(指针用操作符‘*’和‘->’,引用使用操作符‘。
’),但是它们似乎有相同的功能。
指针与引用都是让你间接引用其他对象。
你如何决定在什么时候使用指针,在什么时候使用引用呢?首先,要认识到在任何情况下都不能用指向空值的引用。
一个引用必须总是指向某些对象。
因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。
相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。
“但是,请等一下”,你怀疑地问,“这样的代码会产生什么样的后果?”char *pc = 0;//设置指针为空值char& rc = *pc;//让引用指向空值这是非常有害的,毫无疑问。
结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生),应该躲开写出这样代码的人除非他们同意改正错误。
如果你担心这样的代码会出现在你的软件里,那么你最好完全避免使用引用,要不然就去让更优秀的程序员去做。
我们以后将忽略一个引用指向空值的可能性。
因为引用肯定会指向一个对象,在C++里,引用应被初始化。
string& rs;//错误,引用必须被初始化string s("xyzzy");string& rs = s;//正确,rs指向s指针没有这样的限制。
string *ps;//未初始化的指针//合法但危险不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。
因为在使用引用之前不需要测试它的合法性。
void printDouble(const double& rd){cout << rd; //不需要测试rd,它} //肯定指向一个double值相反,指针则应该总是被测试,防止其为空:void printDouble(const double *pd){if (pd){ //检查是否为NULLcout << *pd;}}指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。
但是引用则总是指向在初始化时被指定的对象,以后不能改变。
string s1("Nancy");string s2("Clancy");string& // rs引用s1string *ps = // ps指向s1rs = s2; // rs仍旧引用s1,//但是s1的值现在是// "Clancy"ps = // ps现在指向s2;// s1没有改变总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。
如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。
还有一种情况,就是当你重载某个操作符时,你应该使用引用。
最普通的例子是操作符[].这个操作符典型的用法是返回一个目标对象,其能被赋值。
vector<int> v(10); //建立整形向量(vector),大小为10;//向量是一个在标准C库中的一个模板(见条款35)v[5] = 10; //这个被赋值的目标对象就是操作符[]返回的值如果操作符[]返回一个指针,那么后一个语句就得这样写:*v[5] = 10;但是这样会使得v看上去象是一个向量指针。
因此你会选择让操作符返回一个引用。
(这有一个有趣的例外,参见条款30)当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。
而在除此之外的其他情况下,则应使用指针假设你有void func(int* p, intint a = 1;int b = 1;func(指针本身的值(地址值)是以pass by value进行的,你能改变地址值,但这并不会改变指针所指向的变量的值,p = someotherpointer;//a is still 1但能用指针来改变指针所指向的变量的值,*p = 123131;// a now is 123131但引用本身是以pass by reference进行的,改变其值即改变引用所对应的变量的值r = 1231;// b now is 1231尽可能使用引用,不得已时使用指针。
当你不需要“重新指向”时,引用一般优先于指针被选用。
这通常意味着引用用于类的公有接口时更有用。
引用出现的典型场合是对象的表面,而指针用于对象内部。
上述的例外情况是函数的参数或返回值需要一个“临界”的引用时。
这时通常最好返回/获取一个指针,并使用NULL指针来完成这个特殊的使命。
(引用应该总是对象的别名,而不是被解除引用的NULL指针)。
注意:由于在调用者的代码处,无法提供清晰的的引用语义,所以传统的C 程序员有时并不喜欢引用。
然而,当有了一些C++经验后,你会很快认识到这是信息隐藏的一种形式,它是有益的而不是有害的。
就如同,程序员应该针对要解决的问题写代码,而不是机器本身。