指针的引入:·为函数修改实参提供支持
·为动态内存管理提供支持
·为动态数据结构提供支持
·为内存访问提供另一种途径
指针概述:
·内存地址:系统为了内存管理的方便,将内存划分为一个个的内存单元(1个内存单元占1个字节),并为每一个内存单元进行了编号,内存单元的编号称为该内存单元的地址,一般情况下,我们每一个变量都是由多个内存单元构成的,所以每一个变量的内存地址,其实就是这个变量对应的第一个内存单元的地址,也叫首地址
·变量指针:变量地址称为该变量的指针,变量地址往往是指变量在内存中第一个内存单元的编号(首地址)
·指针变量:存放其他变量的地址变量
·指向:指针变量中存放谁的地址,就说明该指针变量指向了谁
指针初始:
运行结果:
定义指针变量的一般形式:
基本类型标识符 * 指针变量名
eg:int x, *s 说明s是一个指针变量,但不能说*s是指针变量
指针变量的定义:
语法:数据类型 *变量列表
Eg:int a;//普通变量
int *a,*b;//指针变量
注意:·虽然定义指针变量*a,是在变量名前加*,但是实际变量名为a而不是*a
·使用指针变量间接访问内存数据时,指针变量必须要有明确的指向
·如果想借助指针变量间接访问指针变量保存的内存地址上的数据,可以使用指针变量前加*来间接访问。指针变量前加*,也称对指针变量解引用
·指针变量只能指向同类型的变量,借助指针变量访问内存,一次访问的内存 大小是取决于指针变量的类型
·指针变量在定义时可以初始化,这一点与普通变量是一样的
指针变量的使用:
指针变量的赋值:
操作指针变量的值:
操作指针变量指向的值:
指针变量作为函数参数:
指针变量作函数参数往往传递的是变量的地址(首地址),借助指针变量间接访问是可以修改实参变量数据的
案例1:
需求:要求用函数处理,用指针变量作为函数的参数
·方式1:交换指向:(执行的普通变量的值不变)
·方式2:交换值(指向的普通变量的值改变)
通过指针引用数组:
数组元素的指针
·数组指针:数组中的第一个元素的地址(数组首地址)
·指针数组:用来存放数组元素地址的数组
注意:虽然定义了一个指针变量接受数组地址,但不能理解为指针变量指向了数组,而应该理解为指向了数组的元素
指针的运算:
指针运算:指针变量必须要指向数组中的某个元素
数组名作函数参数
表现形式:·实参和形参都用数组名
·实参用数组名, 形参用指针变量
·实参形参都有指针变量
·实参为指针变量,形参为数组
函数的传参:
·值传递:一般发生在函数形参的类型为char、short、int、long、float、double这样的类型,他的传递一般是实参将自己的值复制一份给形参,也就是实参变量与形参变量的变量空间是独立的,此时形参无法改变实参的数据
·引用传递:一般发生在函数形参类型为数组,指针这样的类型,他的传递一般是实参将自 己内存的首地址复制一份给形参,也就是实参变量和形参变量对应内存空间 是同一个。此时形参可以改变实参的数据
数组指针:
数组指针:指向一维数组的指针变量
数组指针定义:假定该指针变量指向具有n个元素的一维数组,则数组指针变量定义如下:
数据类型 (*数组指针变量名)[n];
举例:
·一维数组:
||
·二维数组:
一维数组与二维数组的比较: