相关博客目录
C++程序设计基础学习笔记:(1)初识C++语言:从认识变量和常量开始,数据的表示
C++程序设计基础学习笔记:(2)计算:从数据运算开始,数据简单运算
C++程序设计基础学习笔记:(3)分支结构:无处不在的抉择
C++程序设计基础学习笔记:(4)循环结构:周而复始,求同存异
C++程序设计基础学习笔记:(5)数组:实现算法的利器
C++程序设计基础学习笔记:(6)指针:所向披靡的“金箍棒” 魂
C++程序设计基础学习笔记:(7)函数:面向过程的基础
C++程序设计基础学习笔记:(8)文件:让数据流动起来
C++程序设计基础学习笔记:(9)以人为本:用类与对象诠释现实世界
C++程序设计基础学习笔记:(10)从生物遗传说起,取其精华——继承与多态
第6章 指针:所向披靡的“金箍棒” 魂
6.1 指针概述及基本应用
内存地址
计算机的内存被划分为一个个的存储单元,简称内存单元。
内存单元按一定的规则编号,这个编号就是存储单元的地址。
变量与内存地址
程序中定义的变量要占用一定的内存空间,不同的数据类型的变量占用的内存空间大小不一样。
访问内存中的数据
从内存单元中访问数据的方法有两种:直接访问和间接访问。
直接访问
通过变量名,直接对变量的存储单元进行存取访问。
定义变量后,该变量名也就成为了相应内存空间的名称,表现在程序语句中就是通过变量名来存取变量内容。
间接访问
根据变量的地址进行存取访问。
指针变量与指针变量的定义
指针变量是一种特殊的变量,用于存放内存单元的地址,即能存放地址的变量就是指针变量。
指针变量定义的一般格式如下:
数据类型 *指针变量名;
- 1
定义语句中的“*”表示该变量为指针变量。
指针变量前的数据类型规定了指针变量指向的变量的数据类型。
例如:double *p;
定义变量p为指针变量,且指针变量p的值只能是一个double类型变量的地址。
指针变量的三个要素
变量名:与一般变量取名相同,由英文字符开始。
指针变量的类型:指针所指向的变量的类型,而不是自身的类型。指针变量本身均为long int类型;
指针变量的值:是某个变量的内存地址。
地址运算符:&
取地址运算符&,是一个一元运算符,用来得到一个变量的地址。
例如int a;
&a表示变量a在内存中的起始地址。&后面必须是一个变量。
指针运算符 ‘’*’’
指针运算符* 是一个一元运算符,表示指针变量所指向的变量的值(取值),需要跟一个指针类型的变量。(这就是间接访问的形式)
注意*在不同地方出现的含义是不同的。
指针变量的初始化与赋值
在定义初始化时赋值:
数据类型 *指针名=地址
- 1
指针赋值:
指针变量=地址;
- 1
其中的“地址”可以是变量的地址、数组名等。
指针赋值注意事项
不能把常量或表达式赋给指针变量。p=&67;p=&(i+5)是非法的
不能将一个整数赋给指针变量,但可以赋整数值0,0是可以直接赋给指针变量的唯一整数值,表示空地址
6.2 指针和一维数组
指针与一维数组
数组名表示数组的首地址,即数组第一个元素的地址
数组名是地址常量不可以更改
数组名加上整型实数可以实现数组其他元素的取用a+1是a[i]的地址
可以使用数组首地址作为指针信息给指针变量赋值
数组取用有两种方式:下标表示(前面已经讲过),指针表示
a[i] (直接访问) <=> *(a+i) (间接访问)
指针的算术运算与比较运算
算数运算和比较运算的组合可以很容易完成指针对于数组的遍历循环
p++后,p指针指向的地址->下一个下标对应的地址
p–后,p指针指向的地址->上一个下标对应的地址
若有语句int*p1=&a[1], *p2=&a[4];p2-p1的意义两指针之间的数据个数
p1与p2可以比较大小
举例:求两个集合的交集
6.3.1指针和二维数组
二维数组与行指针与列指针
从逻辑上看有行列的关系,但是存在于计算机中还是线性存储
举例:int a[3][4]
;
对于二维数组a:
a是数组名,包含三个元素a[0], a[1], a[2]
每个元素a[i],又是一个一维数组,包含4个元素;
二维数组具有二级地址的含义
a
-----行地址,数组的首地址,第0行首地址
a+i
-----行地址,第i行的首地址
a[i]
<=>*(a+i)
----列地址,第i行第0列的元素地址所以称
a+i
为行指针
a[i]+j
<=>*(a+i)+j
—列地址,第i行第j列的元素地址
*(a[i]+j)
<=>*(*(a+i)+j)
<=>a[i][j]
第i行第j列元素值所以称
*(a+i)+j
为列指针
指向二维数组单个元素的指针变量:列指针
指向二维数组中一维数组的指针变量:行指针
6.3.2 指针和二维数组应用
背景
数学模型
代码
6.4 指针数组
指针数组定义
数据类型 *数组名[数组长度说明]; 例 int *p[4];
- 1
- 2
- 3
指针数组赋值与初始化
指针数组赋值
指针数组初始化
二维数组与指针数组区别
用指针数组处理二维数组
指针数组与数组指针的区别
语法形式:
指针数组
int *a[10];
数组指针int(*p)[10];
实际含义:
指针数组是指一个数组里面装着指针,也即指针数组是一个数组;
数组指针是一个指向数组的指针,本质上还是一个指针,只不过指向数组而已;
对字符串排序(简单选择排序按字典顺序从小到大排序)
在内存中并没有改变
改变的是指针数组中每个指针对应的位置上
6.5 多级指针、动态存储分配
多级指针(二级指针)
定义: 指向指针的指针
一级指针:指针变量中存放目标变量的地址
二级指针:指针变量中存放一级指针变量的地址
举例:用二级指针处理字符串
二级指针与指针数组的关系
int **p
与int *q[10]
指针数组名
q
是二级指针常量,q[i]
是指针变量;如果执行
p=q;
则p+i
是q[i]
的地址;系统只给
p
分配能保存一个指针值的内存区;而给q
分配10块内存区,每块可保存一个指针值;
动态存储分配
分配
动态存储分配: 程序需在运行时根据需要分配相应大小的存储空间。
动态分配内存的格式如下:
指针变量名 = new 类型名(初值列表);
- 1
由于空间没有变量名字所以只能通过指针进行间接访问
类型名决定分配空间的大小
初值列表是可选的
举例
释放
释放指针所指向的内存空间的格式为:
delete 指针名;
- 1
例如:delete point;
注意: 释放了point所指目标的内存空间,指针point本身并没有撤销。
建议这时将point置空(NULL)。
判断申请空间是否成功
动态数组
动态数组解决什么问题?
定义数组时元素个数还不能确定;(在编译前还不能确定)
动态数组如何定义?
指针变量名=new 类型名[下标表达式]; delete[ ] 指向该数组的指针变量名;
- 1
- 2
指定数组元素的个数,可以是变量
如何访问各元素?
由上式定义的是无名数组,
其元素只能通过指针变量间接访问。
举例:
评论记录:
回复评论: