中援用与指针的区别 C

中援用与指针的区别 C

本文目录导航:

C++中援用与指针的区别

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)指针作为参数启动传递:#include<iostream>using namespace std;void swap(int *a,int *b){int temp=*a;*a=*b;*b=temp;}int main(void){int a=1,b=2;swap(&a,&b);cout<<a<< <<b<<endl;system(pause);return 0;}结果为2 1;用指针传递参数,可以成功对实参启动扭转的目标,是由于传递上来的是实参的地址,因此经常使用*a实践上是取存储实参的内存单元里的数据,即是对实参启动扭转,因此可以到达目标。

再看一个程序;#include<iostream>using namespace std;void test(int *p){int a=1;p=&a;cout<<p<< <<*p<<endl;}int main(void){int *p=NULL;test(p);if(p==NULL)cout<<指针p为NULL<<endl;system(pause);return 0;}运转结果为:0x22ff44 1指针p为NULL大家或许会感到奇异,怎样回事,不是传递的是地址么,怎样p回事NULL?理想上,在main函数中申明了一个指针p,并赋值为NULL,当调用test函数时,理想上行递的也是地址,只不过传递的是指地址。

也就是说将指针作为参数启动传递时,理想上也是值传递,只不过传递的是地址。

当把指针作为参数启动传递时,也是将实参的一个拷贝传递给形参,即上方程序main函数中的p何test函数中经常使用的p不是同一个变量,存储2个变量p的单元也不相反(只是2个p指向同一个存储单元),那么在test函数中对p启动修正,并不会影响到main函数中的p的值。

假设要想到达也同时修正的目标的话,就得经常使用援用了。

2.将援用作为函数的参数启动传递。

在讲援用作为函数参数启动传递时,实质上行递的是实参自身,即传递出去的不是实参的一个拷贝,因此对形参的修正其实是对实参的修正,所以在用援用启动参数传递时,不只浪费期间,而且可以浪费空间。

看上方这个程序:#include<iostream>using namespace std;void test(int &a){cout<<&a<< <<a<<endl;}int main(void){int a=1;cout<<&a<< <<a<<endl;test(a);system(pause);return 0;}输入结果为: 0x22ff44 10x22ff44 1再看下这个程序:这足以说明用援用启动参数传递时,理想上行递的是实参自身,而不是拷贝。

所以在上述要到达同时修正指针的目标的话,就得经常使用援用了。

#include<iostream>using namespace std;void test(int *&p){int a=1;p=&a;cout<<p<< <<*p<<endl;}int main(void){int *p=NULL;test(p);if(p!=NULL)cout<<指针p不为NULL<<endl;system(pause);return 0;}输入结果为:0x22ff44 1指针p不为NULL

这里的四个const个代表什么意思??const A * const func(const A * const one )

const A * const func(const A * const one )第一个const润色A*,标明前往值是const型的。

第二个const润色func,函数名其实也是一个指针,这里的const就是润色这个指针的。

第三个const是润色A*就是说这个指针指向地址无法变。

第四个const是润色one,就是说这个指针指向的地址的内容是无法变的!C++中const用法总结 常量,如const int max = 100; 优势:const常量有数据类型,而宏常量没有数据类型。

编译器可以对前者启动类型安保审核,而对后者只启动字符交流,没有类型安保审核,并且在字符交流时或许会发生预料不到的失误。

润色类的数据成员。

const数据成员只在某个对象生定期内是常量,而关于整个类而言却是可变的。

由于类可以创立多个对象,不同的对象其const数据成员的值可以不同。

所以不能在类申明中初始化const数据成员,由于类的对象未被创立时,编译器不知道const 数据成员的值是什么。

const数据成员的初始化只能在类的结构函数的初始化表中启动。

润色指针的状况,见下式: const int* a = & [1] int const *a = & [2] int* const a = & [3] const int* const a = & [4] 可以参考《Effective c++》Item21上的做法,假设const位于星号的左侧,则const就是用来润色指针所指向的变量,即指针指向为常量;假设const位于星号的右侧,const就是润色指针自身,即指针自身是常量。

因此,[1]和[2]的状况相反,都是指针所指向的内容为常量,这种状况下不准许对内容启动更改操作,如不能*a = 3 ;[3]为指针自身是常量,而指针所指向的内容不是常量,这种状况下不能对指针自身启动更改操作,如a++是失误的;[4]为指针自身和指向的内容均为常量。

的初始化 先看一下const变量初始化的状况 1) 非指针const常量初始化的状况:A b; const A a = b; 2) 指针const常量初始化的状况: A* d = new A(); const A* c = d; 或许:const A* c = new A(); 3)援用const常量初始化的状况: A f; const A& e = f; // 这样作e只能访问申明为const的函数,而不能访问普通的成员函数; 在函数申明中的运行在函数申明中,const 可以润色函数的前往值,或某个参数;关于成员函数,还可以润色是整个函数。

1) 润色参数的const,如 void fun0(const A* a ); void fun1(const A& a); 调用函数的时刻,用相应的变量初始化const常量,则在函数体中,依照const所润色的局部启动常量化,如形参为const A* a,则不能对传递出去的指针的内容启动扭转,包全了原指针所指向的内容;如形参为const A& a,则不能对传递出去的援用对象启动扭转,包全了原对象的属性。

[留意]:参数const理论用于参数为指针或援用的状况,且只能润色输入参数;若输入参数驳回“值传递”模式,由于函数将智能发生暂时变量用于复制该参数,该参数本就不须要包全,所以不用const润色。

[总结]关于非外部数据类型的输入参数,应该将“值传递”的模式改为“const援用传递”,目标是为了提高效率。

例如,将void Func(A a)改为void Func(const A &a) 关于外部数据类型的输入参数,不要将“值传递”的模式改为“const援用传递”。

否则既达不到提高效率的目标,又降落了函数的可了解性。

例如void Func(int x)不应该改为void Func(const int &x)2) 润色前往值的const,如const A fun2( ); const A* fun3( ); 这样申明了前往值后,const依照润色准则启动润色,起到相应的包全作用。

[总结] 1) 普通状况下,函数的前往值为某个对象时,假设将其申明为const时,多用于操作符的重载。

理论,不倡导用const润色函数的前往值类型为某个对象或对某个对象援用的状况。

2)假设给驳回“指针传递”模式的函数前往值加const润色,那么函数前往值(即指针)的内容不能被修正,该前往值只能被赋给加const 润色的同类型指针。

6.类成员函数中const的经常使用 普通放在函数体后,形如:void fun() const; 任何不会修负数据成员的函数都因该申明为const类型。

假设在编写const成员函数时,不慎修正了数据成员,或许调用了其余非const成员函数,编译器将报错,这大大提高了程序的强健性。

7.经常使用const的一些倡导 1 要大胆的经常使用const,这将给你带来无尽的优势,但前提是你必定搞分明原委; 2 要防止最普通的赋值操作失误,如将const变量赋值,详细可见思索题; 3 在参数中经常使用const应该经常使用援用或指针,而不是普通的对象实例,要素同上; 4 const在成员函数中的三种用法(参数、前往值、函数)要很好的经常使用; 5 不要随便的将函数的前往值类型定为const; 6除了重载操作符外普通不要将前往值类型定为对某个对象的const援用;参考资料:

C言语指针数组 做函数可变参数 ,数组名不带代表首元素地址!!!??求助~~

这个函数头void guide(const char A,char *argv[])就规则了调用格局guide(字符,字符指针数组名);留意,实参只能有两个。

你可能想看:
« 上一篇
下一篇 »

相关推荐

FreeBasic:强大免费开源的64位basic编译器及应用优势

2025年05月10日

82阅读

脊柱侧弯矫正方法大盘点:运动康复、支具矫正等多种方式

2025年05月09日

88阅读

如何在winForm标题栏去掉标题文字且任务栏图标正常显示

2025年05月09日

86阅读

十一黄金周促销广告词大全,国庆购物狂欢等你来

2025年05月09日

78阅读

关闭快速编辑模式及插入模式,设置控制台指定文字颜色举例

2025年05月09日

63阅读

黄金搭档低糖高钙饮品包装及成分功效全解析,适合人群要知晓

2025年05月09日

91阅读