c++ 基础知识 指针和引用
指针算是c语言的灵魂所在,在高手手里就是钢枪,指哪打哪,哈哈,但是我学指针的时候就比较痛苦了,也许一维指针还可以接受,但是二维指针就有点恼火了,再加上复合类型,什么数组的指针,指针的数组,着实有点晕了。然后学习了c++,又多出了一个引用,所以还是写个博客来记录一下吧。
首先指针与引用属于复合类型。复合类型是指基于其他类型的类型。他们都实现了对对象的间接访问。
引用
1、引用为对象起了另外一个名字,引用是引用另外一种类型的复合类型。通过将声明符加上&的形式来定义引用类型。
2、引用必须要初始化。
3、引用并非是一个对象,只是在已经存在的对象上起了另外一个名字,所以引用类型被创建时不会重新分配内存地址。
4、除了常量引用和基类对象的引用之外,其他的普通引用都必须要和与之绑定的对象的类型相同,而且只能绑定在对象上(变量,类等),而不能与字面值和某个表达式的计算结果绑定在一起,可以用一个引用初始化另一个引用,但要保证类型相同。
5、直接使用引用名来进行对象的访问。
例如:
int i = 1;
int refi = i; //refi 是 i 的引用
int ref2i;//错误,未初始化引用
int ref3 = 2333//错误,非常量引用不可绑定字面值
指针
1、指针存放对象的地址,指针是指向另一种类型的复合类型。通过将声明符加上*的形式来定义指针类型。
2、指针无须在定义时赋初值,如果在块区域内定义的指针没有初始化,将是一个不确定的值,也就是野指针。如果要初始化,使用取地址符号&加对象名来初始化指针。
3、指针本身就是一个对象,有他的存储空间,所以因为引用没有自己的地址,所以是不能定义指向引用的指针喔。
4、除了常量指针和基类对象的指针之外,普通指针类型与所指对象的类型一定要相同。
5、使用解引用操作符(*)加上指针名来访问对象,注意指针要确实指向了某一个对象,访问一个没有明确指向的指针必然报错。
6、指针还可以作为if等条件语句的条件,空指针(int *ptr = 0)代表false,其他非空指针代表true
7、void指针是空类型指针,它不指向任何类型,即void指针仅仅是一个地址,所以空类型指针不能进行指针运算,也不能进行间接引用(因为指针运算和间接引用都需要指针的类型信息)。而且给其他类型指针做初始化要进行显示转换。
int i = 0;
int *ptr_i = &i;
int *ptr2;//指针在快作用域定义,没有初始化,将拥有一个不确定的值
int *ptr = 0;//初始化为空指针,也可用nullptr,c++11之前使用NUll
void *p1 = ptr//空类型指针
*p1,p1++, int p2 = p1//这些操作都是不允许的
float p3 = (float *)p1//进行显示转换
都说指针是一把双刃剑,是c/c++的灵魂所在,用得好的好可以在内存的海洋里遨游,那如果滥用的话只会被内存泄漏给溺死喽,在一个程序设计团队里,基本上是一个人写野指针,整个团队去debug。为了不被同事们打死,最好不要出现野指针。
所以建议初始化所有的指针,尽量等定义了变量之后再定义指向它的指针,如果实在是搞不清楚指针应该指向何处,那就把它初始化为0 或者nullptr。
看了上面,可以发现某些符号具有多重定义:
*和&可以作表达式里的运算符,也可以作声明的一部分使用,这是由于对运算进行了重载,符号的具体功能要根据上下文来决定(我理解也就是符号所在的位置)
举个栗子就懂了
int i = 1;int *ptri =&i;//*声明指针变量的一部分,&取地址符int &j = i; //&声明引用的一部分int i = *ptri;//解引用符5 * 6;//乘法运算符5 & 6;//按位与运算符
指针与引用的服用方法
首先引用与指针都是对对象的间接访问方式,但是在具体实现细节上有很大不同。指针就像是一个渣男,不仅有自己的私房钱(指针本身就是对象,占据内存空间),而且还特别不专一(指针的指向是可以变化的),不管教的话还特别喜欢浪(在块作用域不进行初始化就成了野指针),还有一些什么类型的都接受(void *)的,而引用就不一样了,在自己的生命之中,只爱一个对象,不夹私货(引用本身是占内存空间的),绝无二心(被初始化引用在生命周期里不可再绑定另外一个对象)。所以在在函数传参是,优先使用引用喔。
普通的引用与指针还是喜欢与自己类型相匹配的人(普通指针与引用类型与对象类型必须相同),但也是存在喜欢找刺激的。
他们都愿意和其他同类型的朋友分享自己的对象(额…,允许多个同类型的引用与指针引用或指向同一个对象,)。
好了,就不骚话联翩了,大概就是这样,善待指针与引用,他们会大大方便编程工作。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
