版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、8. 1 指指针针是什么是什么8. 2 指针变量指针变量8. 3 通过指针引用数组通过指针引用数组8. 4 通过指针引用字符串通过指针引用字符串8. 5 指向函数的指针指向函数的指针8.6 返回指针值的函数返回指针值的函数8.7 指针数组和多重指针指针数组和多重指针8.8 动态内存分配与指向它的指针变量动态内存分配与指向它的指针变量8.9 有关指针的小结有关指针的小结#include int main() char string=“I love China!”; printf(“%sn”,string); printf(“%cn”,string7); return 0;stringstring
2、+7#include int main() char *string=“I love China!”; printf(“%sn”,string); printf(“%cn”, * string); return 0;stringchar *string; string=” I love China!”; #include int main() char *string=“I love China!”; printf(“%sn”,string); string=”I am a student.”; printf(“%sn”,string); return 0;string一个函数可以返回一个整型
3、值、字符值一个函数可以返回一个整型值、字符值、实型值等,也可以返回指针型的数据、实型值等,也可以返回指针型的数据,即地址。其概念与以前类似,只是返,即地址。其概念与以前类似,只是返回的值的类型是指针类型而已回的值的类型是指针类型而已定义返回指针值的函数的一般形式为定义返回指针值的函数的一般形式为 类型名类型名 *函数名函数名(参数表列参数表列); 例例8.25有有a个学生,每个学生有个学生,每个学生有b门课门课程的成绩。要求在用户输入学生序号以程的成绩。要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针后,能输出该学生的全部成绩。用指针函数实现函数实现。 解题思路:解题思路:u定义二维
4、数组定义二维数组score存放成绩存放成绩u定义输出定义输出某某学生全部成绩的函数学生全部成绩的函数search,它,它是返回指针的函数,形参是是返回指针的函数,形参是行指针行指针和整型和整型u主函数将主函数将score和要找的学号和要找的学号k传递给形参传递给形参u函数的返回值是函数的返回值是&scorek0(k号号学生的学生的序号为序号为0的课程地址的课程地址)u在主函数中输出该生的全部成绩在主函数中输出该生的全部成绩#include int main()float score 4=60,70,80,90, 56,89,67,88,34,78,90,66; float *searc
5、h(float (*pointer)4,int n); float *p; int i,k; scanf(“%d”,&k); printf(The scores of No.%d are:n,k); p=search(score,k); for(i=0;i4;i+) printf(“%5.2ft”,*(p+i); printf(n); return 0;返回返回k号号学生课程首地址学生课程首地址float *search(float (*pointer)4,int n) float *pt; pt=*(pointer+n); return(pt);1. 多维数组元素的地址多维数组元素的
6、地址int a34=1,3,5,7, 9,11,13,15,17,19,21,23;1357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指针行指针列指针列指针a代表第代表第0行首地址行首地址a+1代表第代表第1行首地址行首地址a+2代表第代表第2行首地址行首地址1357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指针行指针列指针列指针行指针每加行指针每加1,走一行,走一行a+i代表行号为代表行号为i的行首地址(按行变化)的行首地址(按行变化)*(a+i)代表什么?代表什么?1357911131517
7、192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指针行指针列指针列指针相当于相当于ai8.7.1 什么是指针数组什么是指针数组8.7.2 指向指针数据的指针指向指针数据的指针8.7.3 指针数组作指针数组作main函数的形参函数的形参一个数组,若其元素均为指针类型数一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针据,称为指针数组,也就是说,指针数组中的每一个元素都存放一个地址数组中的每一个元素都存放一个地址,相当于一个指针变量。,相当于一个指针变量。定义一维指针数组的一般形式为定义一维指针数组的一般形式为 类型名类型名*数组名数组名数组长度数组长度;
8、int *p4;指针数组比较适合用来指向若干个字指针数组比较适合用来指向若干个字符串,使字符串处理更加方便灵活符串,使字符串处理更加方便灵活可以分别定义一些字符串,然后用指可以分别定义一些字符串,然后用指针数组中的元素分别指向各字符串针数组中的元素分别指向各字符串由于由于各字符串长度一般是不相等的各字符串长度一般是不相等的,所以比用二维数组节省所以比用二维数组节省内存单元内存单元 例例8.27 将若干字符串按字母顺序(由将若干字符串按字母顺序(由小到大)输出。小到大)输出。解题思路:定义一个指针数组,用各解题思路:定义一个指针数组,用各字符串对它进行初始化,然后用选择字符串对它进行初始化,然后
9、用选择法排序,但不是移动字符串,而是改法排序,但不是移动字符串,而是改变指针数组的各元素的指向。变指针数组的各元素的指向。#include #include int main()void sort(char *name ,int n); void print(char *name ,int n); char *name =“Follow”,“Great”, “FORTRAN”,“Computer”; int n=4; sort(name,n); print(name,n); return 0;F o ll o w 0G r e a t 0F O R T R A N 0C o m p u t e
10、 r 0void sort(char *name ,int n) char *temp; int i,j,k; for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; if (k!=i) temp=namei; namei=namek; namek=temp; F o ll o w 0G r e a t 0F O R T R A N 0C o m p u t e r 0name0name1name2name3void print(char *name ,int n) int i; for(i=0;in;i+) printf(“%sn”,namei); 在了解了指针
11、数组的基础上,需要了在了解了指针数组的基础上,需要了解指向指针数据的指针变量,简称为解指向指针数据的指针变量,简称为指向指针的指针。指向指针的指针。F o ll o w 0G r e a t 0F O R T R A N 0C o m p u t e r 0name0name1name2name3namep例例8.28 使用指向指针数据的指针变量。使用指向指针数据的指针变量。 char *name=“Follow”,“Great”, “FORTRAN”,“Computer”; char *p; int i; for(i=0;i5;i+) p=name+i; printf(%sn,*p); F
12、o ll o w 0G r e a t 0F O R T R A N 0C o m p u t e r 0name0name1name2name3namepa+i代表行号为代表行号为i的行首地址(按行变化)的行首地址(按行变化)*(a+i)代表什么?代表什么?1357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指针行指针列指针列指针相当于相当于ai 例例8.29 有一个指针数组,其元素分别指向有一个指针数组,其元素分别指向一个整型数组的元素,用指向指针数据的一个整型数组的元素,用指向指针数据的指针变量,输出整型数组各元素的值。指针变量,输出整型数
13、组各元素的值。#include int main()int a5=1,3,5,7,9; int *num5=&a0,&a1,&a2, &a3,&a4; int *p,i; p=num; for(i=0;i5;i+) printf(%d ,*p); p+; printf(n); return 0; &a0&a1&a2&a3&a4p123458.8.1 什么是内存的动态分配什么是内存的动态分配8.8.2 怎样建立内存的动态分配怎样建立内存的动态分配8.8.3 void指针类型指针类型非静态的局部变量是分配在内存中的动态
14、存非静态的局部变量是分配在内存中的动态存储区的,这个存储区是一个称为储区的,这个存储区是一个称为栈栈的区域的区域C语言还允许建立内存动态分配区域,以存语言还允许建立内存动态分配区域,以存放一些临时用的数据,这些数据需要时随时放一些临时用的数据,这些数据需要时随时开辟,不需要时随时释放。这些数据是临时开辟,不需要时随时释放。这些数据是临时存放在一个特别的自由存储区,称为存放在一个特别的自由存储区,称为堆堆区区对内存的动态分配是通过系统提供的库函数对内存的动态分配是通过系统提供的库函数来实现的,主要有来实现的,主要有malloc,calloc,free,realloc这这4个函数。个函数。mall
15、oc函数函数其函数原型为其函数原型为 void *malloc(unsigned int size); u其作用是在内存的动态存储区中分配一个长度其作用是在内存的动态存储区中分配一个长度为为size的连续空间的连续空间u函数的值是所分配区域的第一个字节的地址,函数的值是所分配区域的第一个字节的地址,或者说,此函数是一个指针型函数,返回的指或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置针指向该分配域的开头位置 malloc(100);u开辟开辟100字节的临时分配域,函数值为其第字节的临时分配域,函数值为其第1个字节的地址个字节的地址 注意指针的基类型为注意指针的基类型为voi
16、d,即不指向任何,即不指向任何类型的数据,只提供一个地址类型的数据,只提供一个地址如果此函数未能成功地执行(例如内存空间如果此函数未能成功地执行(例如内存空间不足),则返回空指针不足),则返回空指针(NULL)2calloc函数函数其函数原型为其函数原型为 void *calloc(unsigned n,unsigned size); 其作用是在内存的动态存储区中分配其作用是在内存的动态存储区中分配n个长度个长度为为size的连续空间,这个空间一般比较大,的连续空间,这个空间一般比较大,足以保存一个数组。足以保存一个数组。用用calloc函数可以为一维数组开辟动态存储函数可以为一维数组开辟动态
17、存储空间,空间,n为数组元素个数,每个元素长度为为数组元素个数,每个元素长度为size。这就是动态数组。函数返回指向所分。这就是动态数组。函数返回指向所分配域的起始位置的指针;如果分配不成功,配域的起始位置的指针;如果分配不成功,返回返回NULL。如:。如: p=calloc(50,4); 开辟开辟504个字节的临时分配域,把起始个字节的临时分配域,把起始地址赋给指针变量地址赋给指针变量p 3free函数函数其函数原型为其函数原型为 void free(void *p); 其作用是释放指针变量所指向的动态其作用是释放指针变量所指向的动态空间,使这部分空间能重新被其他变量空间,使这部分空间能重新
18、被其他变量使用。使用。p应是最近一次调用应是最近一次调用calloc或或malloc函数时得到的函数返回值。函数时得到的函数返回值。 free(p);释放指针变量所指向的已分配的动态释放指针变量所指向的已分配的动态空间空间 free函数无返回值函数无返回值4. realloc函数函数其函数原型为其函数原型为void *realloc(void *p,unsigned int size);如果已经通过如果已经通过malloc函数或函数或calloc函数获函数获得了动态空间,想改变其大小,可以用得了动态空间,想改变其大小,可以用recalloc函数重新分配。函数重新分配。用用realloc函数将函
19、数将p所指向的动态空间的大所指向的动态空间的大小改变为小改变为size。p的值不变。如果重分配不的值不变。如果重分配不成功,返回成功,返回NULL。如。如 realloc(p,50); 将将p所指向的已分配的动态空间改为所指向的已分配的动态空间改为50字节字节 以上以上4个函数的声明在个函数的声明在stdlib.h头文件中,头文件中,在用到这些函数时应当用在用到这些函数时应当用“#include ”指令把指令把stdlib.h头文件包含头文件包含到程序文件中。到程序文件中。 例例8.30 建立动态数组,输入建立动态数组,输入5个学生的成个学生的成绩,另外用一个函放数检查其中有无低于绩,另外用一
20、个函放数检查其中有无低于60分的,输出不合格的成绩。分的,输出不合格的成绩。 解题思路:用解题思路:用malloc函数开辟一个动态函数开辟一个动态自由区域,用来存自由区域,用来存5个学生的成绩,会得到个学生的成绩,会得到这个动态域第一个字节的地址,它的基类这个动态域第一个字节的地址,它的基类型是型是void型。用一个基类型为型。用一个基类型为int的指针的指针变量变量p来指向动态数组的各元素,并输出它来指向动态数组的各元素,并输出它们的值。但必须先把们的值。但必须先把malloc函数返回的函数返回的void指针转换为整型指针,然后赋给指针转换为整型指针,然后赋给p1#include #incl
21、ude int main() void check(int *); int *p1,i; p1=(int *)malloc(5*sizeof(int); for(i=0;i5;i+) scanf(%d,p1+i); check(p1); return 0;void check(int *p) int i; printf(They are fail:); for(i=0;i5;i+) if (pi60) printf(%d ,pi); printf(n); 1.首先要准确地弄清楚指针的含义。指针首先要准确地弄清楚指针的含义。指针就是地址,凡是出现就是地址,凡是出现“指针指针”的地方,都的地方,都
22、可以用可以用“地址地址”代替,例如,变量的指针代替,例如,变量的指针就是变量的地址,指针变量就是地址变量就是变量的地址,指针变量就是地址变量要区别指针和指针变量。指针就是地址本要区别指针和指针变量。指针就是地址本身,而指针变量是用来存放地址的变量。身,而指针变量是用来存放地址的变量。 2. 什么叫什么叫“指向指向”?地址就意味着指向,?地址就意味着指向,因为通过地址能找到具有该地址的对象。因为通过地址能找到具有该地址的对象。对于指针变量来说,把谁的地址存放在指对于指针变量来说,把谁的地址存放在指针变量中,就说此指针变量指向谁。但应针变量中,就说此指针变量指向谁。但应注意:只有与指针变量的基类型
23、相同的数注意:只有与指针变量的基类型相同的数据的地址才能存放在相应的指针变量中。据的地址才能存放在相应的指针变量中。 void *指针是一种特殊的指针,不指向任指针是一种特殊的指针,不指向任何类型的数据,如果需要用此地址指向某何类型的数据,如果需要用此地址指向某类型的数据,应先对地址进行类型转换。类型的数据,应先对地址进行类型转换。可以在程序中进行显式的类型转换,也可可以在程序中进行显式的类型转换,也可以由编译系统自动进行隐式转换。无论用以由编译系统自动进行隐式转换。无论用哪种转换,读者必须了解要进行类型转换哪种转换,读者必须了解要进行类型转换 3. 要深入掌握在对数组的操作中怎样正确要深入掌握在对数组的操作中怎样正确地使用指针,搞清楚指针的指向。一维数地使用指针,搞清楚指针的指向。一维数组名代表数组首元素的地址组名代表数组首元素的地址 int *p,a10; p=a;up是指向是指向int类型的指针变量,类型的指针变量,p只能指向数只能指向数组中的元素,而不是指向整个数组。在进行组中的元素,而不是指向整个数组。在进
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 燃气门站安全运行方案
- PDP性格测试(完整版题目+详细真人版解析)
- 2026年特种设备安全管理人员安全操作知识模拟试卷(附答案)
- 2026年出版专业初级职业资格考试编辑加工与校对模拟试题含答案
- 危险化学品经营安全技术操作规程
- PCB专业技能考核试题(含详细答案)
- 自动售检票系统运维安全操作规程
- 2026年家庭药师服务需求试题及答案
- 2026年陕西省人力资源和社会保障厅下属事业单位考试真题(附答案)
- 施工现场卫生防疫及消杀工作方案
- 《中药炮制学》课程教学大纲
- 心力衰竭消化道出血课件
- 辽宁现代服务职业技术学院单招数学真题及完整答案详解【考点梳理】
- 内衬(覆)不锈钢复合钢管管道工程技术规程
- 高中数学分层练习(基础题):圆锥曲线(60题)
- 院前急救病历书写规范
- 铁路信号设计与施工铁路信号电缆配线09课件
- 电梯维修培训教程
- 《伤寒论》课件-葛根黄芩黄连汤证
- 机械制造加工车间安全手册
- 社区综合治理工作汇报
评论
0/150
提交评论