




免费预览已结束,剩余4页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
泰山职业技术学院电子教案第9章 指针指针是C语言中一个最重要而又较难掌握的一个概念,也是C语言优于其它高级语言的关键所在。掌握指针的应用,可以使程序简洁、紧凑、高效。9.1 地址和指针概述 1. 地址与地址运算地址:计算机中存储单元的编号称为地址。在内存中每一个字节都有地址,一个存储区域的地址是这个区域的第一个字节的地址。地址运算符&:求出变量所占用存储区域的地址注意:(1)地址运算符是单目运算,与单目+、相同;(2)结合方向同:从右到左。2. 指针与指针变量指针:一个存储区域的地址称为指针。指针变量:用来存放存储区域的地址的变量称为指针变量。注意:(1)变量的值可以通过变量直接访问,也可通过指针变量间接访问; (2)指针变量只能用来存放地址,不能存放其它类型数据。9.2 变量的指针和指向变量的指针变量1. 变量的指针和指向变量的指针变量指向变量的指针:一个变量的地址称为指向该变量的指针。指向变量的指针变量:用来存放变量的地址的变量称为指向该变量的指针变量。例:int a;则&a就是指向a的指针;若p为指针变量,且p=&a;则p是指向a的指针变量。2. 指针运算符指针运算符*:求出指针变量所指向存储区域的值或所指向变量的值例:int a;若p为指针变量,且p=&a;则*p是p指向的存储区域的值,即*p的值就是a的值。注意:(1)指针运算符是单目运算,与单目+、相同;(2)结合方向同:从右到左。9.2.1 指针变量的定义1. 指针变量的定义格式:类型名 *指针变量名,;功能:定义指向类型名变量的指针变量。例:int *p;定义一个指向整形变量的指针p。2. 指针变量的赋值格式:指针变量=&变量;功能:把=号右边变量的地址赋给=号左边的指针变量。注意:(1)指针变量赋值后的图表示。 (2)指向不同类型的指针不能互相赋值。 (3)加了#include “stdio.h”后,指针变量可赋值为NULL。9.2.2 指针变量的引用指针变量的引用主要用到地址运算符&和指针运算符*。例9.1。说明:(1)(4).注意:(1)若p=&a;则&*p为a的地址,即&a。 (2)若p=&a;则*&a为a的值,即就是a。 (3)(*p)+与a+等价,因*与+同级,又结合方向为从右向左,故在此()不可省,否则变为*(p+)。若i=3;p=&i;则这两个表达式的值都为3,但执行后前者p仍指向i,且i的值会加1,后者p指向i的后一个区域,i的值未加1。例9.2。说明:此例中p1,p2的指向进行变换,而a,b的值并未交换。9.2.3 指针作为函数参数用指针作为函数的参数,可以实现“通过被调函数改变主调函数中变量的值”的目的。例9.3。说明:此例中p1,p2的指向并未进行变换,而它们指向的值进行了交换。注意:(1)用指针作为函数的参数,就其指针变量而言仍然是有传入没传出,但它传送的是地址,故这时是传址调用,即对指针所指向的值是有传入也有传出,故改变指针指向的值可以实现上述目的。 (2)用指针作为函数的参数,不能通过改变形参指针的值来达到“改变主调函数中变量的值”的目的。例9.4。9.3 数组的指针与指向数组的指针变量 9.3.1 指向数组元素的指针设a为元素个数为n的一维数组,p为指向数组a的元素类型的指针,如果p=a或p=&a0,即p指向a0,则p+i指向ai,此时可把ai写成pi。注意:(1)一维数组名a表示数组a的首地址,即a0的地址,故a与&a0等价。 (2)一维数组a的第i个元素ai的地址可以用a+i表示,故a+i与&ai等价。9.3.2 通过指针引用数组元素设a为元素个数为n的一维数组,p为指向数组a的元素类型的指针,如果p=a或p=&a0,则数组a的第i个元素有两种表示法:ai 或pi 下标表示法*(a+i)或*(p+i) 地址表示法例9.5。说明:三种方法比较,(1)(3)注意:(1)可以改变p的值,但不能改变a的值; (2)要注意指针的当前值。例9.6。 (3)指针值超出数组范围时系统不提示出错。 (4)要注意指针变量的运算。9.3.3 用数组名作为函数参数在函数的参数中,实参与形参可以都是数组,也可以都是指针,还可以一个是数组一个是指针。(1)(4)。例9.7。例9.8。注意:(1)用指针和数组作为参数,它们传送的是地址,故是传址调用,它们所指向的数组的值是有传入也有传出的。 (2)当数组作为形式参数时,数组名不再是常量,与指针意义相同。例9.9。例9.10。9.3.4 指向多维数组的指针和指针变量1. 多维数组元素的地址设a为元素个数为mn的二维数组,则a+i表示第i行ai的地址,*(a+i)+j表示第i行第j个元素aij的地址,于是数组a的第i,j个元素有三种表示法:aij 下标表示法*(ai+j) 下标地址表示法*(*(a+i)+j) 二级地址表示法例9.11。注意:(1)二维数组名a表示数组a的第0行的地址,即a0的地址,故a与&a0等价。 (2)二维数组a的第i个元素ai表示第i行第0个元素的地址,即ai0的地址,故ai与& ai0等价。2. 指向多维数组元素的指针变量(1)指向数组元素的指针设a为元素个数为mn的二维数组,p为指向a的元素类型的指针,如果p=a0,即p指向a00,则p+in+j指向aij。例9.12。(2)指向一维数组的指针指向一维数组的指针称为数组指针。格式:类型名 (*数组指针名)常量表达式,;功能:定义指向元素个数为常量表达式的一维数组的指针。注意:数组指针用来存放一维数组的首地址;例9.13。(3)数组指针与二维数组的行数组指针可用来指向二维数组的行,故也称行指针。设a为元素个数为mn的二维数组,p为指向元素个数为n的一维数组的指针,如果p=a,即p指向a0,则p+i指向ai,* (p+i)+j指向aij。例9.13。3. 用指向数组的指针作为函数的参数普通指针作为函数的参数,因为可以让p+i指向ai(一维数组元素),故可以用来传递一维数组元素的地址;同样的道理,指向数组的指针作为函数的参数,因为可以让p+i指向ai(二维数组的行),故可以用来传递二维数组的行地址。例9.14。例9.15。9.4字符串的指针和指向字符串的指针变量9.4.1 字符串的表示形式在C语言中,字符串有两种表示形式。1 用字符数组存放一个字符串;2 用字符指针指向一个字符串。例9.16,例9.17。注意:(1)字符数组占有固定的存储空间,字符数组名是常量,故不能赋值、不能自增减。 (2)字符指针只是用来存放字符串的首地址,字符指针是变量,故可以赋值、可以自增减。例9.18,例9.19。9.4.2 字符串指针作为函数的参数把字符串从一个函数传递到另一个函数,可有两种方法。1 用存放一个字符串的字符数组;2 用指向一个字符串的字符指针。例9.20。解法:(1)用字符数组作为形参 (2)用字符指针作为形参 (3)对copy_string函数的简化9.4.3 对使用字符指针和字符数组的讨论(1)字符数组存放的是若干个字符,字符指针存放的是字符串的首地址。(2)字符数组不能对数组名赋值,字符指针可以对指针名赋值。(3)字符数组和字符指针都可以初始化。(4)字符数组定义后有分配存储空间存放字符串,字符指针只分配一个单元存放字符地址(字符串的首地址)。(5)字符数组名不能增值,字符指针名可以增值。例9.21,例9.22。(6)当字符数组存放一个字符串或字符指针指向一个字符串时,可用作printf语句的格式控制。9.5 函数的指针和指向函数的指针变量9.5.1 用函数指针变量调用函数一个函数是一个指令的序列,函数执行时是从第一条指令开始直到最后一条指令结束,第一条指令的地址称为函数的入口地址,函数名代表这个函数的入口地址。用来存放函数入口地址的指针称为指向函数的指针,简称函数指针。(1)指向函数的指针定义格式:类型名 (*函数指针变量名)( );功能:定义一个指向函数的指针。(2)指向函数的指针的赋值和引用格式:函数指针变量=函数名; (*函数指针变量)(实参,)功能:前者是把函数的入口地址赋给指向函数的指针,后者是用指向函数的指针调用该函数。于是函数的调用方法有两种: 函数名(实参,) 用函数名调用(*函数指针变量)(实参,) 用函数指针调用例9.23。注意:(1)用函数指针调用函数,必须先给函数指针赋函数名;(2)函数指针虽然是变量,但p+n、p+、p等无意义。9.5.2 用指向函数的指针作函数参数有了函数指针,可以用一个语句调用不同的函数;用函数指针作为函数的参数,可以把不同的函数传递到同一个子函数。因此函数指针可以简化多个函数的调用。例9.24。9.6 返回指针值的函数一个函数的返回值可以是指针类型的,这样的函数称为返回指针值的函数,简称指针函数。格式:函数类型 *函数名(形式参数表列)数据声明部分;执行语句部分;功能:定义一个指向类型名的指针函数。例9.25。例9.26。注意:字符串运算函数strcat、strcpy等都是返回指针的函数。9.7 指针数组和指向指针的指针9.7.1 指针数组的概念数组的元素为指针类型的数组称为指针数组。格式:类型名 *指针数组名常量表达式,;功能:定义指向类型名的指针数组。注意:(1)指向字符型的指针数组称为字符指针数组;(2)mn的二维字符数组可以用来存放m个长度为n-1的字符串; 元素个数为m的字符指针数组可用来指向m个随意长度的字符串。例9.27。9.7.2 指向指针的指针(1)二级指针与多级指针指向指针的指针称为二级指针。格式:类型名 *指针变量名,;功能:定义二级指针。注意:同理可以定义多级指针。(2)二级指针与多级指针的引用设p为二级指针,则*p为一级指针,*p为所指类型的变量。注意:不同级别的指针不能互相赋值。例9.28。例9.29。*9.7.3 指针数组作为main的形参(1)main函数的参数main函数一般是不带参数的,因为没有函数可以调用main函数。但main函数实际上也是可以带参数的,一般格式为: main(int argc,char *argv)其中:形参argc是一个整型变量,形参argv是一个字符指针数组。(2)DOS下执行程序的命令行C源程序*.c被编译连接后生成可执行程序*.exe,可以DOS下通过命令行执行该程序。命令行的一般格式为:可执行程序名 参数 参数 其中:可执行程序名、参数、参数等都是字符串,表示回车符。(3)命令行与源程序的参数传递当用户键入命令行执行时,字符串:可执行程序名、参数、参数、将传送给argv0、argv1、argv2、。Argc将取得命令行中字符串的个数。9.8 有关指针的数据类型和指针运算小结9.8.1 有关指针的数据类型小结涉及到指针的类型主要有:变量,一级指针,一维数组,指针数组,数组指针,函数,指针函数,函数指针,二级指针等。9.8.2 指针运算小结(1)指针与整数相加减设指针p是指向某类型的,这个类型占用c个字节,i为整数,则1 p+,2 p-,3 p+i,4 p-i,5 p+=i,6 p-=i等都是合法的;7 p+i的值(地址)=p的值(地址)+ic(2)指针变量的赋值可以给指针变量赋值的有:1 相应类型变量的地址值;2 一维数组名或其元素的地址值;3 函数的入口地址;4 相应类型指针变量。(3)指针变量可以有空值空指针值用NULL表示,它是一个符号常量,它在stdio.h中,可以把它赋给指针变量,这时表示指针变量有确定值但没有指
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年临港产业集聚区新型厂房租赁管理协议
- 2025年绿色包装材料定制生产与市场推广合作框架协议
- 外企员工绩效考核制度设计指南
- 行政办公楼安全保卫工作制度
- 一年级数学下册重点易错题目解析
- 青少年篮球技能提升训练课程
- 消防设施验收标准与操作流程
- 心理学研究方法考核题库
- 电缆桥架安装技术要求与规范
- 银行客户资料管理操作手册
- 护理质量改进获奖案例
- 绿地日常巡查管理制度
- 中医急症诊疗方案(3篇)
- 2025年上海市高考化学试卷(含答案)
- 三区人才面试题及答案大全
- 物业服务礼仪培训大纲
- 2025年舞台灯光设备项目市场调查研究报告
- 防火钢质门、卷帘门项目可行性研究报告-商业计划书
- 普查保密协议书
- 《初学者指南:美术基础课件》
- 冶金矿山采矿设计规范
评论
0/150
提交评论