第七章指针 本章的主要内容包括: ◆指针 ◆指针与变量 ◆指针与数组 ◆指针与函数 回首页
本章的主要内容包括: 指针 指针与变量 指针与数组 指针与函数 第七章 指针 回首页
7.1地址和指针的概念 内存地址:计算机内存的组织方式是把所有单元顺序排列,每个 单元有一个顺序编号,称单元的地址。形象化地叫指针 地址本身也是用二进制编码的,任何数据对象在它被使用的时候,都必 然有一个确定的存储位置,占据着确定数目的存储单元。 存储在内存的数据,最终都是根据其存储位置,通过存储单元的地址访 问的。 任何变量,在其存在期间,总有一个确定的、固定的存储位置,即固定 的地址。变量地址可能作为数据来操作 指针变量是C语言提供的一种操作变量地址的机制。指针变量中保存的是 其它对象的地址。 通过指针变量,可以进行对有关对象的访问和处理。 讨论C语言操作指针变量和普通变量的特点,什么是直接存取?什么是间 接存取? 讨论使用指针进行程序设计的好处
内存地址:计算机内存的组织方式是把所有单元顺序排列,每个 单元有一个顺序编号,称单元的地址。形象化地叫指针 地址本身也是用二进制编码的,任何数据对象在它被使用的时候,都必 然有一个确定的存储位置,占据着确定数目的存储单元。 存储在内存的数据,最终都是根据其存储位置,通过存储单元的地址访 问的。 任何变量,在其存在期间,总有一个确定的、固定的存储位置,即固定 的地址。变量地址可能作为数据来操作。 指针变量是C语言提供的一种操作变量地址的机制。指针变量中保存的是 其它对象的地址。 通过指针变量,可以进行对有关对象的访问和处理。 讨论C语言操作指针变量和普通变量的特点,什么是直接存取?什么是间 接存取? 讨论使用指针进行程序设计的好处 7.1 地址和指针的概念
7.2指针的定义、使用和运算 7.2.1指针的定义 1.定义指针变量的一般形式如下: 类型名*指针变量名1,*指针变量名2,,,*指针变量名n; 2.空指针 空指针是一个特殊的指针,它的值是0,C语言中用符号常量NULL(在 stdio.h中定义)表示这个空值,并保证这个值不会是任何变量的地 址。空指针对任何指针类型赋值都是合法的。一个指针变量具有空指 针值表示当前它没有指向任何有意义的东西 3.viod指针 (void*)类型的指针叫通用指针,可以指向任何的变量,C语言允许直 接把任何变量的地址作为指针赋给通用指针。 当需要使用通用指针所指的数据参加运算时,需要写出类型强制转换 如通用指针gp所指空间的数据是整型数据,p是整型指针,用下式转 换:p=(int*)gp
7.2.1 指针的定义 1. 定义指针变量的一般形式如下: 类型名 *指针变量名1,*指针变量名2,... *指针变量名n ; 2. 空指针 空指针是一个特殊的指针,它的值是0,C语言中用符号常量NULL(在 stdio.h中定义)表示这个空值,并保证这个值不会是任何变量的地 址。空指针对任何指针类型赋值都是合法的。一个指针变量具有空指 针值表示当前它没有指向任何有意义的东西。 3. viod指针 (void *)类型的指针叫通用指针,可以指向任何的变量,C语言允许直 接把任何变量的地址作为指针赋给通用指针。 当需要使用通用指针所指的数据参加运算时,需要写出类型强制转换。 如通用指针gp所指空间的数据是整型数据,p是整型指针,用下式转 换: p=(int *)gp; 7.2 指针的定义、使用和运算
7.2指针的定义、使用和运算 7.2.2指针的操作 1.指针赋值 (1)取地址运算(一元运算符&)和指针赋值 (2)指针变量赋值 (3)通过标准函数获得地址值 2.间接运算(一元运算符*) 将一元运算符‘*’放在指针变量名前,也可以是地址前,效果 是由一个指针得到被它指向的变量,可以像使用普通变量 样使用该表达式。 3.移动指针 移动指针就是对指针变量加上或减去一个整数、或通过赋值运算, 使指针变量指向相邻的存储单元。因此,只有当指针指向 串连续的存储单元时,指针移动才有意义
7.2.2 指针的操作 1. 指针赋值 (1) 取地址运算(一元运算符&)和指针赋值 (2) 指针变量赋值 (3) 通过标准函数获得地址值 2. 间接运算(一元运算符*) 将一元运算符‘*’放在指针变量名前,也可以是地址前,效果 是由一个指针得到被它指向的变量,可以像使用普通变量一 样使用该表达式。 3. 移动指针 移动指针就是对指针变量加上或减去一个整数、或通过赋值运算, 使指针变量指向相邻的存储单元。因此,只有当指针指向一 串连续的存储单元时,指针移动才有意义。 7.2 指针的定义、使用和运算
7.2指针的定义、使用和运算 7.2.2指针的操作 ●3.移动指针 对指针进行加八减运算中,数字“1不再代表十进制数“12,而 型指针移动1个存储单元就是移动2个字节,双精度变量存储 单元长度是8,双精度型指针移动1个存储单元就是移动8个 字节,依此类推。 程序中移动指针时,不论指针的基类型是什么,只需简单地加、减一个 数而不必去管它的具体长度,系统将会根据指针的基类型自动确定 位移的字节数 最常用的移动操作就是加一和减一操作艹、一。它们分别代表指针向地 址值增大的方向移动一个存储单元和指针向地址值减少的方向移动 个存储单元。 两个指向同一串连续单元的指针可以进行相减的运算,结果是两个指针 之间元素的个数,可以通过赋值使两个指针指向同一个单元
7.2.2 指针的操作 3. 移动指针 对指针进行加、减运算中,数字“1”不再代表十进制数“1” ,而 是1个存储单元长度,整型变量存储单元长度是2个字节,整 型指针移动1个存储单元就是移动2个字节,双精度变量存储 单元长度是8,双精度型指针移动1个存储单元就是移动8个 字节,依此类推。 程序中移动指针时,不论指针的基类型是什么,只需简单地加、减一个 数而不必去管它的具体长度,系统将会根据指针的基类型自动确定 位移的字节数 最常用的移动操作就是加一和减一操作++、--。它们分别代表指针向地 址值增大的方向移动一个存储单元和指针向地址值减少的方向移动 一个存储单元。 两个指向同一串连续单元的指针可以进行相减的运算,结果是两个指针 之间元素的个数,可以通过赋值使两个指针指向同一个单元。 7.2 指针的定义、使用和运算
7.2指针的定义、使用和运算 7.2.2指针的操作 4.指针比较 ●两个指针指向同一串连续的存储单元时,可以在关系表达式中对 其进行比较,判断指针的位置关系,两个指针变量的值相等 表示它们指向同一个存储单元。还可进行是否是空指针的判 断 指针基类型对指针相关操作的约束和限制: (1)基类型使指针只能指向基类型定义的一类变量。 (2)限制引用操作满足基类型的约束。(范围、运算、内存表示) (3)限制指针移动操作的跨度
7.2.2 指针的操作 4. 指针比较 两个指针指向同一串连续的存储单元时,可以在关系表达式中对 其进行比较,判断指针的位置关系,两个指针变量的值相等, 表示它们指向同一个存储单元。还可进行是否是空指针的判 断。 指针基类型对指针相关操作的约束和限制: (1)基类型使指针只能指向基类型定义的一类变量。 (2)限制引用操作满足基类型的约束。(范围、运算、内存表示) (3)限制指针移动操作的跨度。 7.2 指针的定义、使用和运算
7.2指针的定义、使用和运算 7.2.3指针变量的初始化 指针变量在定义时可以用任何合法的指针(地址)值进行初始化 如果在定义指针变量时没有进行初始化,全局变量和局部静态变 量将被自动地初始化为空指针(0)。局部自动变量、寄存 器变量将不自动初始化,这些变量建立后的值不能确定。 定要有明确的变量关联后,才能使用这些变量。 7.3函数与指针 形式 类型名函数名(类型名形参1,类型名形参2 /*头部* 说明部分/*函数体* 语句部分
7.2.3 指针变量的初始化 指针变量在定义时可以用任何合法的指针(地址)值进行初始化。 如果在定义指针变量时没有进行初始化,全局变量和局部静态变 量将被自动地初始化为空指针(0)。局部自动变量、寄存 器变量将不自动初始化,这些变量建立后的值不能确定。一 定要有明确的变量关联后,才能使用这些变量。 7.3函数与指针 形式: 类型名 函数名(类型名 形参1,类型名 形参2…) /* 头部 */ { 说明部分 /* 函数体*/ 语句部分 } 7.2 指针的定义、使用和运算
7.3函数与指针 7.3.1指针作函数参数 若函数的形参为指针类型,调用该函数时,对应实参必须是基类 型相同的地址值或已指向某个存储单元的指针变量。虽然实 参和形参之间还是值传递方式,但由于传递的是地址值,所 以形参和实参指到了同一个存储单元,函数中,通过形参操 作的存储单元,与实参所指是同一单元,因此实参的值发生 改变。利用此形式,可以把两个或两个以上的数据从被调 用函数中返回到调用函数。 当需要通过函数改变变量值时,使用指针作函数参数。 7.32返回指针的函数 指针是变量,可以由函数返回。返回指针的函数定义方法: 类型名*函数名(类型名形参1,类型名形参2…) 说明部分 语句部分
7.3.1 指针作函数参数 若函数的形参为指针类型,调用该函数时,对应实参必须是基类 型相同的地址值或已指向某个存储单元的指针变量。虽然实 参和形参之间还是值传递方式,但由于传递的是地址值,所 以形参和实参指到了同一个存储单元,函数中,通过形参操 作的存储单元,与实参所指是同一单元,因此实参的值发生 了改变。利用此形式,可以把两个或两个以上的数据从被调 用函数中返回到调用函数。 当需要通过函数改变变量值时,使用指针作函数参数。 7.3.2 返回指针的函数 指针是变量,可以由函数返回。返回指针的函数定义方法: 类型名 *函数名(类型名形参1,类型名形参2…) { 说明部分 语句部分 } 7.3函数与指针
7.3函数与指针 7.3.2返回指针的函数 函数体内, return语句的表达式的值必须是地址。 返回值可在任何有意义的引用处使用。 733函数指针 函数指针提供了用指针调用函数的机制(间接调用)。 通过函数名得到的是函数的入口地址。函数指针变量存储的是函 数的入口地址。 函数指针变量的定义形式为: 类型名(*指针变量名)(参数类型表); (*p)O)表示p是一个指向函数入口的指针变量,它不固定指向哪 个函数,只是定义了这样一个类型的变量,专门存放函数的 入口地址,程序中可以先后指向不同的函数
7.3.2 返回指针的函数 函数体内,return语句的表达式的值必须是地址。 返回值可在任何有意义的引用处使用。 7.3.3 函数指针 函数指针提供了用指针调用函数的机制(间接调用)。 通过函数名得到的是函数的入口地址。函数指针变量存储的是函 数的入口地址。 函数指针变量的定义形式为: 类型名 (*指针变量名)(参数类型表); (*p)()表示p是一个指向函数入口的指针变量,它不固定指向哪一 个函数,只是定义了这样一个类型的变量,专门存放函数的 入口地址,程序中可以先后指向不同的函数。 7.3函数与指针
7.3函数与指针 733函数指针 使用函数指针的步骤 (1)定义函数指针变量。形如in*pO (2)函数指针变量赋值:如P=函数名:只需给出函数名,不必 (3)通过函数指针调用函数:如c=(*p)(实参) 调用由p指向的函数,返回值赋给c 讨论函数指针和返回指针的函数在定义形式上的差别。 734函数体内指针 函数体内的指针有可能通过与指针形参的赋值等操作,指向函数 体外的存储单元,因此有可能改变调用函数环境中的值
7.3.3 函数指针 使用函数指针的步骤: (1) 定义函数指针变量。形如int *p(); (2) 函数指针变量赋值:如 p = 函数名;只需给出函数名,不必 给出参数。 (3) 通过函数指针调用函数:如 c = (*p)(实参); 调用由p指向的函数,返回值赋给c。 讨论函数指针和返回指针的函数在定义形式上的差别。 7.3.4 函数体内指针 函数体内的指针有可能通过与指针形参的赋值等操作,指向函数 体外的存储单元,因此有可能改变调用函数环境中的值 7.3函数与指针