C/C++基础 -- 指针的定义和使用

本博文由 西北工业大学MOOC 总结而来,以备以后回顾。(侵删)

1、指针的定义

1.1、地址和指针的概念

  程序中的数据对象总是存放在内存中的,在其生命周期内这些对象占据一定的存储空间,有确定的存储位置
  实际上,每个内存单元都有一个地址,即以字节为单位连续编码。编译器将程序中的对象名转换成机器指令能识别的地址,通过地址来存取对象值
  通过变量的方式存取变量值为直接访问,通过指针的方式存取变量值为指针间接访问
(指针的详细概念参见其他博客)

1.2、指针的定义

  C++将专门用来存放对象地址的变量称为指针变量。定义形式如下:在这里插入图片描述
  指针的类型:
  指针的类型是指指针所指向对象的类型。指针本身存储的是地址值,所以指针的类型,就是所指对象所占存储空间的大小。
  假定指针变量 p 的值是0x4000,下面三种写法

char *p;	//1个字节
int *p;		//4个字节
double *p;	//8个字节

在这里插入图片描述

1.3、指针的间接访问

  通过间接引用运算(*)可以访问指针所指向的对象或内存单元。
在这里插入图片描述
例:

int a, *p = &a;	//& 取址符,将a的地址放到指针 p 中
a = 99;	//直接访问a(对象直接访问)
*p = 100;	//*p就是a,此时a=100。 间接访问a(指针间接访问) 
*p = *p+1;	//等价于a = a+1

在这里插入图片描述例:
在这里插入图片描述
应用例:

int main()
{
	int i=100, j=200;
	int *p1, *p2;
	p1=&i, p2=&j;	//p1指向i,p2指向j
	*p1 = *p1+1;	//等价于i=i+1;
	p1 = p2;		//将p2的值赋值给p1,则p1指向j
	*p1 = *p1+1;	//等价于j=j+1;
	return 0;
}

1.4、指针的初始化

在这里插入图片描述
  由于指针数据的特殊性,其初始化和赋值运算是有约束条件的,只能使用以下四种值:
1)0值常量表达(空指针)。
在这里插入图片描述
2)相同指向类型对象的地址(指针初始化)。
在这里插入图片描述3)相同指向类型的另一个有效指针(指针间的赋值运算)。在这里插入图片描述
4)对象存储空间后面下一个有效地址,如数组下一个元素的地址。
在这里插入图片描述

2、指针的有效性

  指针指向一个有确定存储空间的对象(称为已知对象),则改指针是有效的。否则,称为指针是无效的。无效指针使用间接引用运算几乎总会导致崩溃性的异常错误。

2.1、无效指针的几种情况

1)如果指针的值为0,称为0值指针,又称空指针(null pointer),空指针是无效的
在这里插入图片描述
2)如果指针未经初始化,或者没有赋值,或者指针运算后指向未知对象,那么该指针是无效的。
在这里插入图片描述
3)一个指针曾指向一个已知对象,在对象的内存空间释放后,虽然该指针仍指向原来的地址,但指针所指的已是位置对象,称为“迷途指针”(dangling pointer)。在这里插入图片描述

3、指针的运算

  指针的运算都是作用在连续存储空间上才有意义。比如几个单独的变量在存储空间上是不连续的,而数组等在存储空间上是连续的。

3.1、几种常用的指针运算

1)指针加减整数运算

在这里插入图片描述

2)指针变量的自增自减运算

  设p是一个指针变量,其自增自减运算包括p++、++p、p- -、- -p等形式。在这里插入图片描述

3)两指针相减运算

  设 p1、p2是相同类型的两个指针(变量或常量),则 p2 - p1 的结果为两个指针之间对象的个数,如果 p2 的地址值大于 p1,结果为,否则为负。
在这里插入图片描述
  p1 指向数组 x 的第一个元素, p2 指向数组 x 的最后一个元素, p2-p1 的结果就是两个指针之间间隔元素的个数。实际运算过程为:(p2的地址值-p1的地址值)/指针所指类型所占字节大小。(char除以1,int型除以4,double除以8)

4)指针的关系运算

  设p1、p2是同一个指向类型的两个指针(常量或变量),则 p2 和 p1 可以进行关系运算,用于比较两个地址的位置关系
在这里插入图片描述

4、指针的const限定

4.1、指向const对象的指针(对象只读型)

  一个指针变量可以指向只读型对象,称为指向const对象的指针。该类指针不能通过指针修改所指对象的值,但是可以修改指着的所指对象。定义形式为:在这里插入图片描述
  即在指针变量定义前加const限定符,其含义是不允许通过指针来改变所指向的const对象的值在这里插入图片描述
  指向const对象的指针既可以指向const对象,也可以指向非const对象。
  把一个const对象的地址赋给一个非const对象的指针变量是错误的,例如:
在这里插入图片描述
  允许把非const对象的地址指向const对象的指针;不能使用指向const对象的指针修改指向对象的。但由于const指针指向的是一个非const对象,所以可以通过其他方式修改所指对象的值。例如:
在这里插入图片描述
  ****实际编程中,指向const对象的指针常用作函数的形参,以确保传递给函数的实参对象在函数中不被修改:
在这里插入图片描述

4.2、const指针(指针只读型)

  一个指针变量是可以只读,称为const指针。在运行的过程中,该类指针不能修改所指的对象,但是可以修改所指对象的值。定义为:
在这里插入图片描述
在这里插入图片描述

4.3、指向const对象的const指针

  可以定义指向const对象的const指针。该类指针,既不能修改所指的对象,也不能修改所指对象的值。形式为:
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值