指针的定义
- 地址
- 内存单元的编号(是一个从0开始的非负整数)
- 地址值的范围:0~2^地址总线数 - 1
- 指针
- 数据类型:地址,存储地址这种类型的变量
- 保存对象地址的变量,指针是一种"地址变量"。通常也叫"指针变量",统称"指针"
- 指针变量就是存放内存单元编号的变量,或者说指针变量就是存放地址的变量
- 本质:一个操作受限的非负整数
指针的重要性
- 表示一些复杂的数据结构
- 快速的传递数据
- 使函数返回一个以上的值
- 能直接访问硬件
- 能够方便的处理字符串
- 理解面向对象语言中引用的基础
Demo
简单使用
互换两个数
如何通过被调函数修改主调函数普通变量的值?
- 传递给形参的必须为该实参的地址
- 形参必须为指针变量
- 在被调函数中通过
*形参名
的方式就可以修改主调函数相关变量的值
* 的含义
- 乘法
- 定义[指针变量]
- 实例:
int* p;
- 定义一个名字叫 p 的变量,其存放的内容必须是 int 类型变量的地址
- 实例:
- 指针运算符
- 实例:
*p
- 放在已经完成初始化操作的指针变量前面,等价于以 p 的内容为地址的变量
- 实例:
指针和数组
- 指针和一维数组
- 数组名
- 就是一个地址 / 一个符号常量 / 一个地址常量
- 数组名也属于符号常量。数组名这个符号,就代表了数组占的那块内存的首地址
- 不是数组名这个符号的值是那块内存的首地址!而是数组名这个符号本身就代表了首地址这个地址值!它就是这个地址!
- 不是一个变量,更不是一个作为变量的指针
- 数组名
- 下标和指针的关系:
pArr[i]
等价于*(pArr+i)
- 在一个函数内部修改 main 函数内定义的数组
- 需要 2 个参数
- 数组第一个元素的地址(数组名这个符号就代表了数组所占那块内存的首地址)
- 数组的长度
- 代码演示
- 需要 2 个参数
- 指针变量的运算
- 指针变量不能相加、相乘、相除
- 如果两个指针变量指向的是同一块连续空间中的不同存储单元,那么这两个指针变量相减有意义,其结果为两个指针指向元素之间相隔的元素数目
一个指针变量的大小
sizeof (数据类型 | 变量名)
:返回值就是该 [数据类型 | 变量] 所占的字节数
- p 指向 char / int / double 类型变量,其所占的字节数是否一样?是一样的
- p 只保存"所指向变量的首字节地址",但其本身却占用 4 个字节,为什么?以 32 位机为例,共有 2^32 个地址,而表达其中的某一个地址就需要 32 位 Bit,即 4 个字节
- p 只保存了变量首字节的地址,那它如何获悉整个变量到底占用了多少字节?根据指针变量的数据类型。如
int* p = &i;
如此便知道了从首地址往后sizeof(int)
个字节 都是 [p所指向变量] 所占用的内存空间 - 小结
- 一个指针变量无论所指向变量占几个字节,其本身只占 4 个字节
- 一个变量的地址是使用该变量首字节的地址来表示
多级指针
*r
是以r
的内容为地址的变量,即q
**r
是以*r(q)
的内容为地址的变量,即p
***r
是以**r(p)
的内容为地址的变量,即i