指针(pointer)总结

Posted linzijie1998

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针(pointer)总结相关的知识,希望对你有一定的参考价值。

一、描述

指针是 “ 指向 ” 另外一种类型的复合类型。

与引用(reference)不同之处在于:

  1. 指针本身就是一个对象,允许对指针进行复制和拷贝,而且在其生命周期内可以先后指向几个不同的对象;

  2. 指针无需在定义是赋予初值,此时它将拥有一个不确定值。但是建议初始化所有指针,这样可以避免一些不必要的错误。

二、指针的四种状态

  1. 指向一个对象;
  2. 指向紧邻对象所占空间的下一个位置;
  3. 空指针,即没有指向任何对象;
  4. 无效指针,即上述情况之外的其他值。

注意:

试图拷贝或以其他方式访问无效指针的值都将引发错误,但是编译器并不负责检查此类错误!

第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 = &pi;

解引用得到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(听课笔记总结--简单易懂)

Go语言技巧之正确高效使用slice(听课笔记总结--简单易懂)

C和指针 (pointers on C)——第六章:指针(上)