指针(pointer)总结
Posted linzijie1998
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针(pointer)总结相关的知识,希望对你有一定的参考价值。
一、描述
指针是 “ 指向 ” 另外一种类型的复合类型。
与引用(reference)不同之处在于:
指针本身就是一个对象,允许对指针进行复制和拷贝,而且在其生命周期内可以先后指向几个不同的对象;
指针无需在定义是赋予初值,此时它将拥有一个不确定值。但是建议初始化所有指针,这样可以避免一些不必要的错误。
二、指针的四种状态
- 指向一个对象;
- 指向紧邻对象所占空间的下一个位置;
- 空指针,即没有指向任何对象;
- 无效指针,即上述情况之外的其他值。
注意:
试图拷贝或以其他方式访问无效指针的值都将引发错误,但是编译器并不负责检查此类错误!
第2、3种形式的指针是有效的,但是同样受到限制, 试图访问此类指针对象的行为也是不允许的!
三、获取对象地址
指针存放某个对象的地址,要获得该地址需要取地址符(&).
int ival = 5;
int *p = &ival; // p存放变量ival的地址、或者说p是指向变量ival的指针
一般情况下,指针的类型需要与它所指的对象严格匹配!
四、利用指针访问对象
指针指向了一个对象,则允许使用解引用符(*)访问该对象.
int ival = 5;
int *p = &ival;
cout << *p;
五、空指针
空指针不指向任何一个对象,在试图使用一个空指针之前可以首先检查其是否为空.
几种生成空指针的方法:
int *p1 = nullptr; // C++11新标准, 最好使用新标准
int *p2 = 0;
int *p3 = NULL; // 需要cstdlib,等价于上一种方法
不能直接将int变量赋给指针,即使变量值为0
六、void* 指针
void*是一种特殊的指针类型,可用于存放容易对象的地址.
七、指向指针的指针
指针是一个对象,与其他对象一样也有自己的地址,因此允许吧指针的地址再放到另外一个指针去.
int ival = 2;
int *pi = &ival;
int **ppi = π
解引用得到ival的值:
cout << *pi << endl;
cout << **ppi << endl;
八、指向指针的引用
引用本身不是一个对象,因此不能定义指向引用的指针;但是指针时对象,所以可以存在指向指针的引用。
int ival = 2;
int *p; // p是一个int型指针
int *&r = p; // r是一个对指针p的引用
r = &ival; // r引用了指针p,该语句为令p指针指向ival
*r = 0; // 解引用得到ival, 该语句为将ival的值改为0
持续更新中......
以上是关于指针(pointer)总结的主要内容,如果未能解决你的问题,请参考以下文章
(转)Delphi2009初体验 - 语言篇 - 智能指针(Smart Pointer)的实现
5.12 CopyNet和 Pointer-Generator Net 复制机制和指针-生成器网络
Go语言技巧之正确高效使用slice(听课笔记总结--简单易懂)
Go语言技巧之正确高效使用slice(听课笔记总结--简单易懂)