指针

  指针是指向某种类型对象的复合数据类型,是用于数据的迭代器:指向数组中的一个元素。在指向数组元素的指针上使用解引用操作符(*)和自增操作符(++)

1.指针的含义

  指针用于指向对象。与迭代器一样,指针提供对所指对象的间接访问。与迭代器不同的是:指针指向单个对象,而迭代器只能用于访问容器内的元素。具体来说,指针保存的是另一个对象的地址。

  取地址符(&)只能用于左值,因为只有当变量用作左值时,才能取地址。

2.指针的初始化和定义

 2.1 两种指针定义风格

 如下图:

 

在这里我建议大家选用第一种书写风格,因为第二种在连续定义中会引起混淆。

2.2指针取值

1有效的指针必须是以下三种状态:保存一个特定对象的地址;指向某个对象后面的另一对象,或者是0 值。

2.若指针保存0 值,表明它不指向任何对象。

3.未初始化的指针是无效的,直到给该指针赋值后,才可使用它。

 

编程好习惯提示:

  《C++Primer》建议程序员在使用之前初始化所有的变量,尤其是指针。因为C++ 语言无法检测指针是否未被初始化。

  如果可能的话,除非所指向的对象已经存在,否则不要先定义指针,这样可避免定义一个未初始化的指针如果必须分开定义指针和其所指向的对象,则将指针初始化为 0。因为编译器可检测出0值的指针,程序可判断该指针并未指向一个对象。

2.3指针初始化和赋值操作的约束

指针初始化只能使用下面类型的值

1)0值常量表达式

2)类型匹配的对象的地址(若类型不相同则会出现错误)

3)另一对象之后的下一地址

4)同类型的另一个指针

2.4 void*指针

C++提供了特殊的指针类型 void*,它可以保存任何类型对象的地址。

void* 指针只支持几种有限的操作:

1)与另一个指针进行比较;

2)向函数传递void* 指针或从函数返回 void* 指针;

3)给另一个 void* 指针赋值。

4)不允许使用void* 指针操纵它所指向的对象。

2.5给指针赋值和通过指针进行赋值

  给指针赋值和通过指针进行赋值这两种操作确实比较容易混淆。《C++Primer》上给了如下区分建议:如果对左操作数进行解引用(*),则修改的是指针所指对象的值;如果没有使用解引用操作(*),则修改的是指针本身的值。

 

2.6指针和引用的比较

相同点:他们都是间接访问另一个值,同时他们都是复合数据类型。

不同点:1引用必须初始化,而指针在语法上可以先不初始化。

               2 引用赋值修改的是引用所关联的对象的值,引用已经初始化就不能再关联其他对 象。而指针可以通过指针赋值,指向其他同类型的对象。

2.7使用指针访问数组元素

  指针指向数组时,该数组名字自动转换为指向该数组第一个元素的指针。

  

  2.7.1 指针的算术操作

  指针的算术操作和迭代器的算术操作以相同的方式实现(也具有相同的约束)。使用指针的算术操作在指向数组某个元素的指针上加上(或减去)一个整型数值,就可以计算出指向数组另一元素的指针值:

 

这里需要注意的是,在指针加上(减去)一个整型值n时,该新指针指向指针原来指向的元素之后(或之前)的第 n 个元素。所以上图中ip2指向的不是i_array[1],而是i_array[2]

 

只要两个指针所指向同一个数组,则指针可以执行减法操作。他返回的类型是ptrdiff_t 。与 size_t 类型一样,ptrdiff_t 也是一种与机器相关的类型,在 cstddef 头文件中定义。size_t 是unsigned 类型,而 ptrdiff_t 则是 signed 整型。因为size_t用于定义数组长度,所以必须为一个正数,而ptrdiff_t存放的一个数组中的指针之间的距离,他可能就是负数。

2.7.2 下标和指针

  是使用下标访问数组时,实际上是使用下标访问指针,只要指针指向数组元素,就可以对它进行下标操作。如下图:

 

2.8指针和const限定符

2.8.1 指向const对象的指针

   《C++Primer》中用了一页介绍了他的语法,我在这里做下总结:

1)指向const对象的指针指向非const对象,也可以指向const对象。

2)指向非const对象的指针不能指向const对象。

例子如下图:

 

不能使用 void* 指针保存 const 对象的地址,而必须使用 const void* 类型的指针保存 const 对象的地址,如下图

 

在实际的程序中,指向 const 的指针常用作函数的形参。将形参定义为指向 const 的指针,以此确保传递给函数的实际对象在函数中不因为形参而被修改。

2.8.2 const指针

  除指向 const 对象的指针外,C++ 语言还提供了 const 指针——本身的值不能修改

 

与任何 const 量一样,const 指针也必须在定义时初始化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值