版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第8章 指针 指针和指针变量的概念 指针变量的定义与应用 数组与指针 字符串与指针 返回指针值的函数 指向函数的指针 指针数组与指向指针的指针 小结引言C程序设计中使用指针可以:使程序简洁、紧凑、高效有效地表示复杂的数据结构动态分配内存得到多于一个的函数返回值动态数组:指针带回2个以上的值:数组、指针变量与地址程序中: int i; float k; 内存中每个字节有一个编号-地址.2000200120022005内存02003ik 编译或函数调用时为其分配内存单元变量是对程序中数据存储空间的抽象和符号化指针与指针变量 指针:一个变量的地址,变量定义时分配 指针变量:专门存放某个变量地址的变量
2、叫.2000200420062005整型变量i10变量i_pointer2001200220032000指针指针变量 变量的内容 变量的地址指针变量的定义:数据类型 *指针变量;int i=10;int *i_pointer;i_pointer=&i;基类型指针变量i_pointer目标变量 i变量地址(指针)变量值指向地址存入指针变量 &:取变量的地址 *:取指针所指向变量的内容.2000200420062005整型变量i10变量i_pointer2001200220032000指针变量i_pointer-指针变量,它的内容是地址量*i_pointer-指针的目标变量,它的内
3、容是数据&i_pointer-指针变量占用内存的地址i_pointer &i &(*i_pointer)i *i_pointer *(&i)i_pointer = &i = &(*i_pointer)i = *i_pointer = *(&i)200010i_pointer*i_pointer&i_pointeri2000i_pointer 直接访问:按变量地址存取变量值 间接访问:通过存放变量地址的变量去访问变量例 i=3; -直接访问指针变量.2000200420062005整型变量i10变量i_pointer20012002
4、200320003例 *i_pointer=20; -间接访问20指针变量.2000200420062005整型变量i10变量i_pointer2001200220032000整型变量k例 k=i; -直接访问 k=*i_pointer; -间接访问10例 k=i; k=*i_pointer; 间接访问目的:指针变量可以修改,使相同的表达式执行不同数据的操作。指针变量修改表达式n_int=12, *p_int=12n_f=3.14, *p_f=3.14n_ch=p, *p_ch=p指针变量只能指向基类型的变量指针变量定义后,其值不确定,程序示例 使用指针变量求解:输入2个整数,按从小到大顺序输
5、出96n1=9, n2=6min=6, max=9n1=9,n2=6p1p2n1n296程序示例 使用指针变量求解:输入2个整数,按从小到大顺序输出96n1=9, n2=6min=6, max=9n1=6,n2=9p1p2n1n296 6 9.20002008200A200220042006200C200E2010.59整型变量a 整型变量b(main)指针pointer_1指针pointer_220002002(swap)指针p1指针p2整型p5920002002COPY5运行结果:9,5为了利用函数改变变量的值,应该使用指针变量作函数实参程序示例输入3个整数,按降序(从大到小的顺序)输出实
6、参:修改变量的地址函数:修改指针变量的目标变量形参:指针变量指针与数组 数组的指针:数组在内存中的起始地址 数组元素的指针:数组元素在内存中的起始地址 数组名代表数组在内存中的起始地址,是常量 数组元素的引用既可用下标法,也可用指针法下标法直观指针法能使目标程序占用内存少、运行速度快arrayint array10; 数组名array表示数组的首地址,即array0的地址; 数组名array是地址常量,pointer是变量; array+i是元素arrayi的地址 array+i&arrayi pointer+i arrayi*(array+i)*(pointer+i)pointeri
7、 下标法 数组名法 指针法 pointer+1 pointer+1*sizeof(基类型) 地址array+i基类型是int,与pointer的基类型一致pointer 指针与数组 再论数组做函数参数 再论数组做函数参数 字符串的指针 字符串的指针:字符串在内存中的起始地址定义并初始化字符指针变量string:将串常量的内存块的首地址赋给string 字符指针与字符数组存储内容及存储空间不同 字符指针变量中存储的是字符串的首地址,存储空间为2B,注意目标变量空间的问题 字符数组中存储的是字符串本身,存储空间为数组大小赋值方式不同 对字符指针变量,采用下面的赋值语句赋值: char *point
8、er; pointer=This is an apple.; 字符数组,可以在定义时初始化,但不能整体赋值运算。 char char_array20; char_array=“This is an apple.”; /非法操作指针变量的值可以改变,字符指针变量也不例外数组名代表数组的首地址,是一个常量,常量是不能被改变的 char *p,*q; q=“orange”; p=q; char a10,b10=“orange”; a=b; /非法操作 例:定义函数,实现字符串的复制运行结果: I am a student.二aa+1a+2*(*(a+0)+1)*(a0+1)int a34;a0a1a
9、2200020082016200020022008201020162018a00a01a10a11a20a21a02a03a12a13a22a23基类型行指针与列指针a0+1a1+1a2+1*(a+0)+1*(a+1)+1*(a+2)+1对于二维数组:(1)a是数组名,包含三个元素a0,a1,a2(2)每个元素ai又是一个一维数组,包含4个元素 对二维数组 int a34,有 a-二维数组的首地址,即第0行的首地址 a+i-第i行的首地址 ai *(a+i)-第i行第0列的元素地址 ai+j *(a+i)+j -第i行第j列的元素地址 *(ai+j) *(*(a+i)+j) aija+i=&a
10、mp;ai=ai=*(a+i) =&ai0, 值相等,含义不同a+i &ai,表示第i行首地址,指向行ai *(a+i) &ai0,表示第i行第0列元素地址,指向列int a34;a0a1a2200020082016200020022008201020162018a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+2int a34;a00a01a10a11a20a21a02a03a12a13a22a23二维数组元素表示形式:(1)a12(2)*(a1+2)(3)*(*(a+1)+2)(4)*(&a00+1*4+2)地址表示:(1)
11、 a+1 (2) &a10(3) a1(4) *(a+1)(5)(int *) (a+1)行指针列指针地址表示:(1) &a12(2) a1+2(3) *(a+1)+2(4)&a00+1*4+2二二表示形式含义地址a二维数组名,数组首地址a0,*(a+0),*a第0行第0列元素地址a+1第1行首地址a1,*(a+1)第1行第0列元素地址a1+2,*(a+1)+2,&a12第1行第2列元素地址*(a1+2),*(*(a+1)+2),a12第1行第2列元素值2000200020082008201213指向二维数组元素的指针变量main() static int a3
12、4=1,3,5,7,9,11,13,15,17,19,21,23; int *p; for(p=a0;pa0+12;p+) if(p-a0)%4=0) printf(n);printf(%4d ,*p); p=*a; p=&a00; p=*(a+0); p=a; p=*a; p=&a00; p=(int *)a; p=a; int a34;a00a01a10a11a20a21a02a03a12a13a22a23p使用行指针输出2维数组的任一元素运行结果: Input row = 1 Input col = 2 array12 = 7本题若直接用数组名array作指针,应如何修改
13、?printf(“array%1d%1d = %dn”, row, col, *(*array+4*row+col);使用列指针输出二维数组中,指定位置上的元素运行结果: Input row = 1 Input col = 2 array12 = 7指向一维数组的指针变量 定义形式: 数据类型 (*指针名)一维数组维数; 例 int (*p)4;( )不能少int (*p)4与int *p4不同p的值是一维数组的首地址,p是行指针可让p指向二维数组某一行如 int a34, (*p)4=a;一维数组指针变量维数和二维数组列数必须相同int a34;a00a01a10a11a20a21a02a0
14、3a12a13a22a23aa+1a+2pp+1p+2p0+1或 *p+1p1+2或 *(p+1)+2*(*p+1)或 (*p)1 *(*(p+1)+2)指向一维数组的指针变量main() static int a34=1,3,5,7,9,11,13,15,17,19,21,23; int i,j,(*p)4; for(p=a,i=0;i3;i+,p+) for(j=0;j lock +|- 程序示例用同一程序实现文件的加密和解密。 定义格式:数据类型 *指针变量; 赋值方式:指针变量 = 指针数组名 + i 二维数组的指针作函数参数 用指向变量的指针变量 用指向一维数组的指针变量 用二维数组
15、名实参形参数组名int x4指针变量int (*q)4数组名int x4指针变量int (*q)4数组名a数组名a指针变量p1指针变量p1若int a34; int (*p1)4=a; int *p2=a0;指针变量p2指针变量int *q二维数组的指针作函数参数程序示例3个学生各学4门课,计算总平均分,并输出第n个学生成绩main() void average(float *p,int n); void search(float (*p)4,int n); float score34=65,67,79,60,80,87,90,81,90,99,100,98; average(*score,1
16、2); search(score,2);void average(float *p,int n) float *p_end, sum=0,aver; p_end=p+n-1; for(;p=p_end;p+)sum=sum+(*p); aver=sum/n; printf(average=%5.2fn,aver);void search(float (*p)4, int n) int i; printf( No.%d :n,n); for(i=0;i4;i+) printf(%5.2f ,*(*(p+n)+i);列指针行指针函数说明float p465527960808790819099100
17、98pp pni指针的数据类型指针的数据类型定义含义int i;int *p;int an;int *pn;int (*p)n;int f();int *p();int (*p)();int *p;定义整型变量ip为指向整型数据的指针变量定义含n个元素的整型数组an个指向整型数据的指针变量组成的指针数组pp为指向含n个元素的一维整型数组的指针变量f为返回整型数的函数p为返回指针的函数,该指针指向一个整型数据p为指向函数的指针变量,该函数返回整型数p为指针变量,它指向一个指向整型数据的指针变量指针的数据类型(续)例 下列定义的含义(1)int *p3;(2)int (*p)3;(3)int *p
18、(int);(4)int (*p)(int);指针数组指向一维数组的指针返回指针的函数指向函数的指针,函数返回int型变量课外学习任务练习题:实验指导书:预习:第十一章请将预习中出现的问题记录在作业本上。练习 写出下列程序的运行结果:编译警告!结果不对!int x;int *p=&x;运行结果:9,9.20002008200A200220042006200C200E2010.59整型变量a 整型变量b(main)指针pointer_1指针pointer_2200020029920002002COPY(swap)指针p1指针p2指针p*假设2000指针变量在使用前必须赋值!练习 写出下列
19、程序的运行结果:运行结果:5,9.20002008200A200220042006200C200E2010.59整型a 整型b(main)pointer_1pointer_2200020029COPY(swap)整型x整型b整型t555 9值传递练习 写出下列程序的运行结果:运行结果:5,9.20002008200A200220042006200C200E2010.59整型a 整型b(main)pointer_1pointer_22000200220002002COPY(swap)指针p1指针p2指针p*200020002002值传递.20002008200A200220042006200C2
20、00E2010.59整型变量a 整型变量b(main)指针pointer_1指针pointer_220002002(swap)指针p1指针p2整型p5920002002COPY5运行结果:9,5为了利用函数改变变量的值,应该使用指针变量作函数实参练习 有四种对指针变量进行操作的语句,以下判断正确的是: (1) int *p, *q; p=q;int a,*p,*q; p=q=&a; (2) int a,*p,*q; q=&a; p=*q;int a=20,*p; *p=a; (3)int a=b=0,*p; p=&a; b=*p;int a=20,*p,*q=&
21、a; *p=*q; (4) int a=20,*p,*q=&a; p=q;int p,*q;q=&p;(A) (1)正确,(2)(3)(4)不正确(B) (1)(4)正确,(2)(3)不正确(C) (3)正确,(1)(2)(4)不正确(D) (4)正确,(1)(2)(3)不正确答案:D练习 以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是: main() int *p,*q,a,b;p=&a;printf(Input a:);scanf(%d,*p); (A) *p表示的是指针变量p的地址(B) *p表示的是变量a的值,而不是变量a的地址 (C) *p表示的是指针变量p的值(D) *p只能用来说明p是一个指针变量答案:B练习设 char *s=ta017bc;则指针变量s所指向的字符串所占的字节数是: (A) 9 (B)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 47116-2026地下采矿机械工作面移动式采掘机械采煤机和犁式系统的安全要求
- 2026年陕西国际旅行卫生保健中心招聘笔试参考题库及答案解析
- 2026年2月江苏苏州市航空教育科技有限公司招聘3人考试参考题库及答案解析
- 2026黑龙江齐齐哈尔市依安县招聘公益性岗位人员15人笔试参考题库及答案解析
- 2026江西鹰潭月湖区交通运输局招聘工作人员1人考试备考题库及答案解析
- 2026四川广安明德职业高中学校面向社会招聘32人考试参考试题及答案解析
- 2026江苏无锡市东北塘中学招聘食堂工作人员4人考试参考题库及答案解析
- 2026年LED 生长灯项目营销方案
- 2026年智能窗帘轨道项目评估报告
- 2026福建医科大学附属第二医院视障辅助技术工程研究中心科研助理招聘1人考试参考题库及答案解析
- 水务公司2026年节后复工安全生产培训
- (2025年)泰兴市事业单位招聘财务会计知识试题及答案
- 《力与大地:重力、摩擦力的科学透视与地理联结》-初中科学(八年级)单元复习课教学设计
- 2025年宁波职业技术学院单招职业技能考试题库附答案解析
- 工程地质工程施工钻探工春节后复工安全考核试卷含答案
- 动火作业现场安全管控方案
- 机械制造技术(教案-所有章节)
- 方言传承的代际差异-洞察及研究
- 企业开工第一课安全培训
- 中医埋线课件
- 近五年宁夏中考物理真题及答案2024
评论
0/150
提交评论