指针
- 什么是指针
指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为"指针"。意思是通过它能找到以它为地址的内存单元。
作个比喻,假设将电脑存储器当成一本书,一张内容记录了某个页码加上行号的便利贴,可以被当成是一个指向特定页面的指针。根据便利粘贴面的页码与行号,翻到那个页面,把那个页面的那一行文字读出来,就相当于是对这个指针进行反参考的动作。
- 指针的定义
(1)指针是变量,但是指针的字节长度是固定的。因为指针保存的是地址,由操作系统的位数决定,32位机的字节是4,64位机的字节是8。
(2)指针指向的内存空间和对应的内存空间
(3)在信息工程中指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器中寄存器(用来指向该内存地址所对应的变量或数组)。指针一般出现在比较接近机器语言的语言,如汇编语言或C语言。
3.指针的运算
(1)指针 +/- 整数 = 指针所对应的内存空间与它所指向的类型乘以整数相加减。
(2)指针 - 指针 = 两个指针相差的数据个数。
(3)指针的比较:如果两个指针变量指向同一个数组的元素,那么指向前面元素的指针变量小于指向后面元素的指针变量。
(4)指针加指针没有实际意义。
4.指针的使用
当我们给指针赋值的时候,我们要注意指针是否分配了合理的内存。如果指针的地址为空,那么就要在堆上用malloc给它分配空间,这样可以避免野指针的出现。
二级指针
- 什么是二级指针
首先任何值都有地址 ,一级指针的值虽然是地址,但这个地址做为一个值亦需要空间来存放,是空间就具有地址 ,这就是存放地址这一值的空间所具有的地址,二级指针就是为了获取这个地址。根据地址的不同情况,二级指针又分为指向指针变量的指针和指向数组的指针。
- 二级指针的数据类型和指向数据类型
(1)本身的数据类型:int ** 4个字节
(2)指向的数据类型:int * 4个字节
3.二级指针的内容和指向
指针的表现形式是地址,核心是指向关系指针,运算符“*”的作用是按照指向关系访问所指向的对象。
如果存在A指向B的指向关系,则A是B的地址,“*A”表示通过这个指向关系间接访问B。如果B的值也是一个指针,它指向C,则B是C的地址,“*B”表示间接访问C,如果C是整型、实型或者结构体等类型的变量或者是存放这些类型的数据的数组元素,则B(即C的地址)是普通的指针,称为一级指针,用于存放一级指针的变量称为一级指针变量,指向一级指针变量的"A"则是"二级指针"。
4.const修饰二级指针
(1) Int const **p: 不能改变**p
Int ** const p: 不能改变p
(2)判断等号两边的数据类型是否相同
当*和&出现在等号的两侧时,一遍多或者少一个*(&),另一边就要多或者少一个&(*)
当*和&出现在同一侧的时候,两个可以相互抵消。
指针数组
1.什么是指针数组
本质是一个数组,不过里面的元素都是指针。一维指针数组的定义形式为:"类型名 *数组标识符[数组长度]"。
例如,一个一维指针数组的定义:int *array[10]。
2.运用
(1)指针数组可以作为函数的参量使用,使用方式与普通数组类似。
(2)指针数组常适用于指向若干字符串,这样使字符串处理更加灵活方便。
数组指针
- 数组指针的定义
数组指针,指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。例:int (*p)[10]; p即为指向数组的指针,又称数组指针。
数组指针是指向数组整体的,int arr[5],他的数据类型是int [5]
数据类型 (*变量名)[一维数组的元素个数]
如果不加(),变量名先和[ ]去结合,变成数组,然后再和*去结合,变成指针,最终变成指针数组。
2.数组指针和指针数组
数组指针:他是一个指针,指向了一个数组 int (*p)[5]
指针数组:他是一个数组,里面存放的都是指针 int *p[5]
3.数组指针的指向类型和数据类型
指向类型:int ()[5]
数据类型:int (*)[5]
4.数组指针的运算
P+1:往地址增大的方向移动一个数组类型,p的指向没有改变
P-1:往地址减小的方向移动一个数组类型,p不改变
P++:增大的方向移动一个数据类型,p的指向已经改变
P--:减小的方向移动一格数据类型,p改变
5.二维数组指针
(1)二维数组的本质:数组元素是一维数组的一维数组。
(2)这里a是个二维数组的数组名,相当于一个二级指针常量。p是一个指针变量,它指向包含5个int元素的一维数组,此时p的增量以它所指向的一维数组长度为单位。
p+i是一维数组a[i]的地址,即p+i==&a[i];对该式两边作取内容运算(*)得*(p+i)==a[i],由于二维数组中a[i]==&a[i][0],则*(p+i)表示a[i][0]的地址,即*(p+i)==&a[i][0]。
*(p+2)+3表示a[2][3]地址(第一行为0行,第一列为0列),*(*(p+2)+3)表示a[2][3]的值。
Malloc和 free
(1)#include <stdlib.h>
void *malloc(size_t size)
作用:在堆区申请一片空间
返回值:成功返回申请空间的首地址,失败返回NULL
参数:想要申请多大的空间用sizeof计算
Void *是空指针,空指针是存在的,但是void类型的变量是不存在的。空指针也叫万能指针。
(2)void free(void *ptr)
作用:释放申请到的空间
参数:申请空间的首地址
(3)#include <string.h>
void *memset(void *s, int c, size_t n)
作用:清空申请到的空间
参数1:申请到空间的首地址
参数2:用什么数据去清空
参数3:清空多大的空间