版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第8章 指针18.1 指针与指针变量指针与指针变量8.2 指针与函数指针与函数8.3 指针与数组指针与数组8.4 指针与字符串指针与字符串8.5 指针数组与命令行参数指针数组与命令行参数8.6 程序举例程序举例内存地址和变量地址内存地址:内存是以字节为单位的一片连续的存储内存地址:内存是以字节为单位的一片连续的存储空间,为了便于访问,给每个字节单元一个唯一的空间,为了便于访问,给每个字节单元一个唯一的编号,这个编号称为内存单元地址。编号,这个编号称为内存单元地址。变量地址:在变量地址:在C语言中定义一个变量,系统会按照语言中定义一个变量,系统会按照它的类型在内存中分配相应的字节,其中第一个字它
2、的类型在内存中分配相应的字节,其中第一个字节的地址(即首地址)称为变量地址。节的地址(即首地址)称为变量地址。关系关系变量存储在内存中。变量存储在内存中。所需的字节数由变量的类型决定。所需的字节数由变量的类型决定。首字节的地址为变量地址。首字节的地址为变量地址。2指针的概念指针:变量的地址就是变量的指针,所谓指针即地指针:变量的地址就是变量的指针,所谓指针即地址。址。p已知已知a的地址为的地址为2000,int a=3;a的地址是的地址是_。a的指针是的指针是_。a的值是的值是_。3200020003变量的访问方式变量的三要素:类型、名字、值。变量的三要素:类型、名字、值。变量的类型:决定变量
3、所需存储单元的字节数。变量的类型:决定变量所需存储单元的字节数。变量的名字:对应存储它的存储单元,通过变量名可变量的名字:对应存储它的存储单元,通过变量名可以在相应存储单元中找到变量。以在相应存储单元中找到变量。变量的值:存储变量的存储单元的内容。变量的值:存储变量的存储单元的内容。变量的访问方式变量的访问方式直接存取直接存取:按照变量名或地址存取变量值的方式称为:按照变量名或地址存取变量值的方式称为 “直接存取直接存取”方式。方式。间接存取间接存取:定义一种特殊的变量专门存放变量的地址,:定义一种特殊的变量专门存放变量的地址,然后根据特殊变量的值(变量的地址)再存取变量值然后根据特殊变量的值
4、(变量的地址)再存取变量值的方式称为的方式称为“间接存取间接存取”方式方式 。4专门存放变量地址的专门存放变量地址的变量称为变量称为“指针变指针变量量”。变量的访问方式已知变量已知变量a的地址为的地址为2000。int a=3;通过地址通过地址2000找到变量找到变量a所在的所在的存储单元,其值为存储单元,其值为3。定义一个特殊变量定义一个特殊变量p,把变量,把变量a的的地址地址2000放入到变量放入到变量p中。中。访问变量访问变量p得到变量得到变量a的地址的地址2000。通过地址通过地址2000,再访问内存,得到,再访问内存,得到变量变量a的值的值3。1.指针变量指针变量:存放变量地址的变量
5、。:存放变量地址的变量。520002001200220032004655353直接访问直接访问间接访间接访问问指针变量的定义定义形式:定义形式:类型标识符类型标识符 *指针变量名指针变量名;int a; /*定义一个整型变量定义一个整型变量a*/int *p; /*定义一个指向整型的指针变量定义一个指向整型的指针变量p*/已知变量已知变量a的值为的值为3,变量,变量a的地址为的地址为2000,请填空。,请填空。int a=_;int *p=_;A)3B)&a已知变量定义为:已知变量定义为:float a=3.6;int *p=&a;请问上述定义请问上述定义有错误吗?如果有,请说
6、明原因。有错误吗?如果有,请说明原因。6AB指针变量和它所指向的指针变量和它所指向的变量类型必须相同。变量类型必须相同。float a=3.6;float *p=&a;指针变量的初始化&:取地址运算符。:取地址运算符。*:指针运算符,或称指向运算符,间接访问运算符。:指针运算符,或称指向运算符,间接访问运算符。p*的两种含义:的两种含义:*出现在变量定义时,其含义是定义一个指针变量。出现在变量定义时,其含义是定义一个指针变量。*出现在指针变量前,其含义是指针运算符,即间接访问出现在指针变量前,其含义是指针运算符,即间接访问运算符。运算符。int a=3,*p=_;*p=_;A)
7、aB)&a7BA/*变量定义处,变量定义处,*含义为定义指针变量含义为定义指针变量*/*指针变量指针变量p已经定义,已经定义,*含义为间接访问运算符含义为间接访问运算符*/指针变量的引用已知变量已知变量a的内存地址是的内存地址是2000,分析以下程序段的输,分析以下程序段的输出结果。出结果。#include main()int a=3,*p=&a; printf(%d,%dn,&a,a); printf(%d,%dn,p,*p);2000,32000,38由此可见:由此可见:pp和和&a的含义相同的含义相同p*p和和a的含义相同的含义相同指针运算指针的赋值运算指
8、针的赋值运算变量地址赋给指针变量,使指针指向该变量。变量地址赋给指针变量,使指针指向该变量。int a,b,*p;p=&a;p=&b;相同类型的指针变量间赋值。相同类型的指针变量间赋值。int a,*p=&a,*q;q=p;9指针运算指针的赋值运算指针的赋值运算给指针变量赋空值给指针变量赋空值int *p=NULL;或或int *p=0;#include int *s;main()int *p; static int *q; printf(%d,%d,%dn,p,q,s);10全局指针变量全局指针变量或或静态局部静态局部指针变量指针变量未赋值,其默未赋值,其默认值为空指
9、针。认值为空指针。指针运算指针的算术运算指针的算术运算#include main()int a=3,b=5,c=8,*p=&a; printf(%d,%dn,p,*p); p=p+1; printf(%d,%dn,p,*p); p=p+1; printf(%d,%dn,p,*p);1120002001200220032004200565535a=3b=5c=8ppp2000,32002,52004,8指针变量的算术运算,其指针变量的算术运算,其操作为地址的移动。操作为地址的移动。指针运算指针的关系运算指针的关系运算p已知已知a的地址为的地址为2000,b的地址为的地址为4000,分析程
10、序运,分析程序运行结果。行结果。#include main()int a=8,b=5,*p=&a,*q=&b; if(ab)printf(%dn,a); elseprintf(%dn,b); if(pq)printf(%dn,a); elseprintf(%dn,b);12多级指针二级指针的定义形式:类型名二级指针的定义形式:类型名 *指针变量名指针变量名int a=3;int *p=&a;int *s=_;int *s=_; /*指向指针的指针指向指针的指针*/13&a&p指针与函数函数参数可以是指针,此时传递的是地址,而不是数函数参数可以是指针,此时
11、传递的是地址,而不是数据值。据值。#include void f(int a)print(%dn,a);main()int x=3,*p=&x; /*已知已知x的地址是的地址是2000*/ f(x);14f(p)/*实参实参p是指针变量,传递地址是指针变量,传递地址*/void f(int *a)/*形参需要定义为指针变量,接收地址形参需要定义为指针变量,接收地址*/f(&x)/*实参是变量的地址,传递地址实参是变量的地址,传递地址*/指针作为函数参数#include void swap(int x,int y)int t; printf(nnbefore:x=%d,y=%dn
12、,x,y); t=x; x=y;y=t; printf(nnafter:x=%d,y=%dn,x,y);main()int a=34,b=56; printf(nnbefore:a=%d,b=%dn,a,b); swap(a,b); printf(nnafter:a=%d,b=%dn,a,b);15abxy3456p函数调用,值传递函数调用,值传递时,行参分配存储时,行参分配存储空间,即实参和行空间,即实参和行参占用不同的存储参占用不同的存储单元。单元。指针作为函数参数#include void swap(int *x,int *y)int t; printf(nnbefore:*x=%d,*
13、y=%dn,*x,*y); t=*x; *x=*y; *y=t; printf(nnafter:*x=%d,*y=%dn,*x,*y);main()int a=34,b=56,*p=&a,*q=&b; printf(nnbefore:a=%d,b=%dn,a,b); swap(p,q); printf(nnafter:a=%d,b=%dn,a,b);16abxypqp函数调用,地址传函数调用,地址传递时,实参将地址递时,实参将地址传递给行参,此时传递给行参,此时实参和行参指向相实参和行参指向相同的存储单元同的存储单元。指针函数指针函数的含义:是指函数的返回值为指针的函数。指针函
14、数的含义:是指函数的返回值为指针的函数。问题问题1:函数返回值的类型应该和:函数返回值的类型应该和_一致。一致。问题问题2:函数的返回值是指针类型,:函数的返回值是指针类型,_也应该定义也应该定义为指针类型。为指针类型。问题问题3:自定义函数的函数头部分?:自定义函数的函数头部分?函数类型函数类型 函数名函数名(参数参数1类型类型 参数参数1名名,)指针函数的定义形式:指针函数的定义形式:函数类型函数类型 *函数名函数名(参数参数1类型类型 参数参数1名名,)17函数类型函数类型函数类型函数类型指针函数举例#include int *max(int a,int b)int *p; if(ab)
15、 p=&a; else p=&b; return p;main()int x,y,*m; scanf(%d,%d,&x,&y); m=max(x,y); printf(max=%dn,*m);#include int max(int a,int b)int p; if(ab) p=a; else p=b; return p;main()int x,y,m; scanf(%d,%d,&x,&y); m=max(x,y); printf(max=%dn,m);18返回值返回值p为为a、b中的大数。中的大数。返回值返回值p是是a、b中大数的地中大数的地
16、址,是个指针;所以函数类址,是个指针;所以函数类型也需要定义为指针类型。型也需要定义为指针类型。指向函数的指针复习:变量地址如何获得?复习:变量地址如何获得?函数地址函数地址:函数包括一组指令序列,存储在某一段:函数包括一组指令序列,存储在某一段内存中,这段内存空间的内存中,这段内存空间的起始地址称为函数的入口起始地址称为函数的入口地址地址。通过函数名可以获得函数地址,即通过函数名可以获得函数地址,即函数名代表函数函数名代表函数的入口地址的入口地址。函数的入口地址称为函数的入口地址称为函数的指针函数的指针。定义一个指针变量,其值等于函数的入口地址,这定义一个指针变量,其值等于函数的入口地址,这
17、样的指针称为样的指针称为指向函数的指针变量指向函数的指针变量。19指向函数的指针定义形式:类型标识符定义形式:类型标识符 (*指针变量名指针变量名)();int *p; /*定义一个指向整型变量的指针变量定义一个指向整型变量的指针变量p*/int *p(); /*定义一个整型指针函数定义一个整型指针函数p,函数返回值为指针类型,函数返回值为指针类型*/int (*p)(); /*定义一个指向整型函数的指针变量定义一个指向整型函数的指针变量p*/20指向指针的函数#include int max(int a,int b)int m; if(ab) m=a; else m=b; return m;
18、main()int x,y,t; scanf(%d,%d,&x,&y); t=max(x,y); printf(max=%dn,t);#include int max(int a,int b)int m; if(ab) m=a; else m=b; return m;main()int x,y,t,(*p)(); scanf(%d,%d,&x,&y); p=max; t=(*p)(x,y); printf(max=%dn,t);21F函数指针赋值函数指针赋值时,只需要给时,只需要给出函数名。出函数名。指针与数组问题问题1:数组名代表:数组名代表_。问题问题2:数
19、组的地址就是数组的:数组的地址就是数组的_。问题问题3:定义一个指针变量,存放数组的首地址,这个:定义一个指针变量,存放数组的首地址,这个指针变量称为指针变量称为_。int a,*p;p=&a; /*指针变量指针变量p指向变量指向变量a,存放变量,存放变量a的首地址的首地址*/int s10,*p;p=s; /*指针变量指针变量p指向一维数组指向一维数组s,存放数组,存放数组s的首地址的首地址*/22数组的首地址数组的首地址指针指针指向数组的指针变量指向数组的指针变量指向一维数组的指针#include main()int a5=1,2,3,4,5; int *p=a; printf(%
20、dn,*p+); printf(%dn,*+p); printf(%dn,(*p)+);23*p+等价于等价于*(p+)1*+p等价于等价于*(+p)21一维数组元素的表示方法已知数组和指向数组的指针变量定义如下:已知数组和指向数组的指针变量定义如下:int a10;int *p=a;问题:引用下标为问题:引用下标为2的数组元素有几种方法?的数组元素有几种方法?a2p2/*下标表示法下标表示法*/*(a+2)*(p+2)/*指针表示法指针表示法*/24ai或或pi*(a+i)或或*(p+i)二维数组的地址已知有如下定义已知有如下定义int a16;int s44;p请回答下列问题。请回答下列问
21、题。a3表示表示_。s3表示表示_。s00 s01 s02 s03s10 s11 s12 s13s20 s21 s22 s23s30 s31 s32 s3325一维数组一维数组a中下标为中下标为3的的一个元素一个元素二维数组二维数组s中行下标为中行下标为3的的一行元素一行元素可以认为,可以认为,s3本身就是本身就是个一维数组,长度为个一维数组,长度为4。所以,所以,s3就是这个一维就是这个一维数组的首地址。数组的首地址。二维数组元素的表示方法已知数组和指向数组的指针变量定义如下:已知数组和指向数组的指针变量定义如下:int a1010;int *p=a;问题:引用行下标为问题:引用行下标为2,
22、列下标为,列下标为3的数组元素有几种的数组元素有几种方法?方法?a23p23/*下标表示法下标表示法*/*(*(a+2)+3)*(*(p+2)+3)/*指针表示法指针表示法*/26aij或或pij*(*(a+i)+j)或或*(*(p+i)+j)二维数组元素的表示方法已知数组和指向数组的指针变量定义如下:已知数组和指向数组的指针变量定义如下:int a1010;int *p=a;数组的第数组的第1个(行下标为个(行下标为0,列下标为,列下标为0)元素为:)元素为:*a。分析:这种引用是否正确?分析:这种引用是否正确?27二级指针二级指针字符串的指针表示法字符指针的含义:指向字符串的指针。字符指针
23、的含义:指向字符串的指针。字符指针的定义形式:字符指针的定义形式:char *指针变量名指针变量名;28利用字符指针处理字符串的几种方法通过在定义时初始化指针变量使指针指向一个字符通过在定义时初始化指针变量使指针指向一个字符串。串。char *p=computer; /*指针变量指针变量p存放字符串的首地址存放字符串的首地址*/printf(%sn,p);用指针变量实现对字符串的访问。用指针变量实现对字符串的访问。char *p=computer; /*指针变量指针变量p存放字符串的首地址存放字符串的首地址*/printf(%sn,p+2);29字符串数组字符串数组的含义:所谓字符串数组是指数
24、组中的每字符串数组的含义:所谓字符串数组是指数组中的每个元素都是一个字符串。个元素都是一个字符串。复习:复习:C语言中,字符串用语言中,字符串用_数组存放。数组存放。问题:一个数组的每个元素都是一个字符串,则这个问题:一个数组的每个元素都是一个字符串,则这个数组是数组是_数组。数组。char s37=FOXPRO,VISUAL,PASCAL;F O X P R O 0VIS U A L 0P A S C A L 030一维一维二维二维指针数组指针数组的含义:数组的指针数组的含义:数组的每个元素都是指针变量每个元素都是指针变量,且,且具有相同的存储类型和指向相同的数据类型,这样的具有相同的存储类
25、型和指向相同的数据类型,这样的数组称为指针数组。数组称为指针数组。指针数组的定义形式:指针数组的定义形式:类型标识符类型标识符 *数组名数组名数组长度数组长度;int a10; /*定义一个长度为定义一个长度为10的数组,元素类型均为整型的数组,元素类型均为整型*/int *s10; /*定义一个长度为定义一个长度为10的数组,元素类型为指向整型的指针变量的数组,元素类型为指向整型的指针变量*/31指针数组的定义F O X P R O 0VIS U A L 0P A S C A L 0char *p3=FOXPRO,VISUAL,PASCAL;问题问题1:数组共有:数组共有3个元素,每个元素都是个元素,每个元素都是_类型。类型。问题问题2:数组中的每个元素和相应的字符串有什么关:数组中的每个元素和相应的字符串有什么关系?系?数组中的每个元素中存放的对应字符串的首地址。数组中的每个元素中存放的对应字符串的首地址。32指针指针命令行参数在操作系统命令状态下,可以输入程序或命令使其运在操作系统命令状态下,可以输入程序或命令使其运行,称行,称命令行状态命令行状态。输入的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年黑龙江省伊春市初中历史七年级期末上册评估重点试卷(详细参考解析)
- PCR扩增技术专项考试题(含详细答案)
- 蜡染工安全操作规程
- 粉尘清扫作业安全操作规程
- PACS系统岗位实操考核试题(含详细答案解析)
- OPPO在线笔试题(含详细答案解析)
- 烟气制酸工安全操作规程
- 水泥窑预热器巡检工安全操作规程
- 2026年护理管理制度试题及答案
- 2026年涂装工理论考试题库附答案
- 世界毒品报告
- 右额颞叶脑出血护理查房
- JJF 2225-2025 高绝缘电阻测量仪(高阻计)校准规范
- 工程标前协议合同模板
- 青春期心里护理
- 2025年湖北行测试题及答案
- 《高中生法制教育》课件
- 四川雅碧江两河口水电站引水发电系统工程施工测量技术方案
- 《商法(第七版)》课件全套 赵万一
- 化学废液处理协议书范本
- 魔兽世界单机版GM命令,物品代码大全39
评论
0/150
提交评论