




已阅读5页,还剩44页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章指针,6.1指针定义与使用6.2指针与函数6.3指针与数组6.4指针与字符串6.5指针数组与多级指针6.6指针与动态内存分配6.7指针的深层应用,6.1指针的引出,一.地址与指针1.地址与取地址运算C程序中的变量在内存中占有一个可标识的存储区,每一个存储区是由若干个字节组成,每一个字节都有自己的地址,而一个存储区的地址是指该存储区中第一个字节的地址,C语言允许在程序中使用变量的地址(通过地址运算符数组变量a的地址-数组名a,2.指针与指针变量(1)变量的访问方式直接访问:通过变量名或地址访问变量的存储区例:scanf(“%d”,间接访问:将一个变量的地址存放在另一个变量中.如将变量x的地址存放在变量p中,访问x时先找到p,再由p中存放的地址找到x,2012,1010,1010,(2)指针:一个变量的指针就是该变量的地址(指针就是地址)(3)指针变量:存放变量地址的变量,它用来指向另一个变量,二、指针变量的定义1.格式:数据类型*指针变量名;例int*p1;char*p2;,2.说明:(1)在变量定义时,*号表示该变量是指针变量(注意:指针变量是p1,p2,不是*p1,*p2)(2)定义指针变量后,系统为其分配存储空间,用以存放其他变量的地址,但在对指针变量赋值前,它并没有确定的值,也不指向一个确定的变量,例:intx,*p;x=5;,2012,1010,5,1234,注:指针变量p的值是随机值,此时p和x并无关联,(3)使指针变量指向一个确定的变量必须进行赋值,intx,*p;x=5;p=,2012,1010,5,1010,三、指针变量的引用1.指针运算符*(1)p与*p不同,p是指针变量,p的值是p所指向的变量的地址*p是p所指向的变量,*p的值是p所指向的变量的值,*p的值为5(*p表示x),而p的值为1010,(2)引用指针变量时的*与定义指针变量时的*不同定义变量时的*只是表示其后的变量是指针变量,inta,*p;p=,2012,1010,5,1010,12,让p指向a,对a重新赋值等价于a=12,即,p的值为a的地址,*p的值为2p的值不变,*p的值为3,(2)c=*p+;,c=*(p+);c=*p;p+;执行后c的值为3,*p的值为5,(3)d=*+p;,d=*(+p);+p;d=*p;执行后d的值为3,*p的值为3,2012,1010,1010,(1)p=,(等价于a+;),1012,3,3,1014,3,例6.2#includevoidmain()int*p1,*p2,*p,a,b;scanf(“%d%d”,temp=x;x=y;y=temp;voidmain()inta,b;scanf(“%d%d”,5,说明:该程序不能实现a和b的交换因为实参a,b对形参x,y是“值传递”,x和y的变化不影响a和b所以输出为:a=5,b=9,9,main,swap,5,5,9,9,5,6.2指针与函数,例6.3#includevoidswap1(int*p1,int*p2)inttemp;temp=*p1;*p1=*p2;*p2=temp;voidmain()inta,b,*pt1,*pt2;scanf(“%d%d”,*temp=*p1;*p1=*p2;*p2=*temp;,说明:这种方法可能会破坏系统的正常工作状态,因为temp是一个指针变量但是在函数中并没有给temp一个确定的地址,这样它所指向的内存单元是不可预见的,而对*temp的赋值可能带来危害,main,p=p1;p1=p2;p2=p;,例:int*fun(inta,intb)函数体;说明:定义一个返回指针值的函数与以前定义函数格式基本类似,只是在函数名前加*,它表明该函数返回一个指针值,而这个指针值是指向一个int型数据,二、函数返回指针,例:#include#include#defineSIZE100charbufSIZE;char*p=buf;char*alloc(intn)char*begin;if(p+n=buf+SIZE)begin=p;p=p+n;return(begin);elsereturn(NULL);,voidmain()char*p1,*p2;inti;p1=alloc(10);strcpy(p1,”123456789”);p2=alloc(5);strcpy(p2,”abcd”);printf(“buf=%pn”,buf);printf(“p1=%pn”,p1);printf(“p2=%pn”,p2);puts(p1);puts(p2);for(i=0;i15;i+)printf(“%c”,bufi);,buf0buf1:buf9buf10:buf14buf15:buf99,buf+10,buf,buf,buf+10,12:90,a:0,10,buf+15,buf+10,5,函数的指针:函数的入口地址在程序执行过程中调用函数时,计算机会转去执行函数体内的语句,因此计算机必须知道函数在什么地方。实际上函数在内存中也要占据一片存储单元,这片存储单元一个起始地址,我们称其为函数的入口地址,即函数的指针,这个函数的入口地址是用函数名来表示。因此我们可以定义一个指针变量,让它的值等于函数的入口地址,然后可以通过这个指针变量来调用函数,该指针变量称为指向函数的指针变量,三、指向函数的指针,指向函数的指针变量1.定义格式:数据类型(*指针变量名)(形参表列);int(*pt)(intarr,intn);说明:数据类型:指针变量所指向的函数的返回值类型形参表列:即指针变量所指向的函数的形参表列格式中的小括号不能省略,2.应用(1)让指针变量指向函数pt=add;因为函数名为函数的入口地址,所以直接将函数名赋给指针变量即可(2)使用指针变量调用函数格式:(*指针变量名)(实参表列),例求一维数组中全部元素的和#includeintadd(intb,intn);voidmain()inta6=1,3,5,7,9,11,total;int(*pt)(intb,intn);pt=add;total=(*pt)(a,6);printf(“total=%dn”,total);intadd(intb,intn)inti,sum=0;for(i=0;in;i+)sum=sum+bi;return(sum);,定义指向函数的指针变量,令指针变量pt指向函数add,通过pt调用函数add,6.3指针与数组,一.一维数组与指针1.一维数组及元素的地址表示inta5=1,2,3,4,5;数组的地址:a,2.用指针变量引用数组元素(1)定义指针变量int*p,a5=1,2,3,4,5;p=a;,(2)引用数组元素,注意:指针变量也可以加下标pk等价于ak分别用三种方法输出数组元素,其效率不同,下标法与地址法的效率相同,指针法的效率较快用指针变量访问数组元素时要注意下标是否越界,例:将数组a中全部元素加1,再输出a#includevoidmain()inta5=1,3,5,7,9,*p,j;for(p=a;pa+5;p+)printf(“%3d”,*p);printf(“n”);for(j=0;j5;j+)aj=aj+1;for(j=0;j5;j+)printf(“%3d”,*(p+j);printf(“n”);,p=a;,aa+1a+2a+3a+4,2,4,6,8,10,可以用p+,但不能用a+因为a代表数组的起始地址它是地址常量,不能改变而p是一个指针变量,使用指针变量时要注意它的当前值,3.指向数组的指针变量作函数参数,例6.7实参和形参都用数组名#includevoidinv1(intx,intn)inttemp,i,j,m=(n-1)/2;for(i=0;i=m;i+)j=n-1-i;temp=xi;xi=xj;xj=temp;voidmain()inti,a6=1,3,4,6,7,9;inv1(a,6);for(i=0;i6;i+)printf(“%3d”,ai);printf(“n”);,a0a1a2a3a4a5,x0x1x2x3x4x5,main,inv1,例6.7实参用数组名,形参用指针变量#includevoidinv2(int*x,intn)inttemp,m=(n-1)/2;int*p,*i,*j;i=x;j=x+n-1;p=x+m;for(;i=p;i+,j-)temp=*i;*i=*j;*j=temp;voidmain()inti,a6=1,3,4,6,7,9;inv2(a,6);for(i=0;i6;i+)printf(“%3d”,ai);printf(“n”);,a0a1a2a3a4a5,inv2,9,1,7,3,6,4,1,a+1,a+4,a+2,a+3,3,4,i和j的指向会变化,p的指向保持不变,例6.7实参和形参都用指针变量#includevoidinv3(int*x,intn);voidmain()int*p,a6=1,3,4,6,7,9;p=a;inv3(p,6);for(p=a;pa+6;p+)printf(“%3d”,*p);printf(“n”);voidinv3(int*x,intn)inttemp,m=(n-1)/2;int*p,*i,*j;i=x;j=x+n-1;p=x+m;for(;i=p;i+,j-)temp=*i;*i=*j;*j=temp;,例6.7实参用指针变量,形参用数组名#includevoidinv4(intx,intn);voidmain()int*p,a6=1,3,4,6,7,9;p=a;inv4(p,6);for(p=a;pa+6;p+)printf(“%3d”,*p);printf(“n”);voidinv4(intx,intn)inttemp,i,j,m=(n-1)/2;for(i=0;i=m;i+)j=n-1-i;temp=xi;xi=xj;xj=temp;,2019/12/12,25,可编辑,例6.8求数组中最大和最小元素#includeintmax,min;voidm1(intarr,intn)int*p,*end;end=arr+n;max=min=*arr;for(p=arr+1;pmax)max=*p;elseif(*pmin)min=*p;voidmain()inti,a6;for(i=0;i6;i+)scanf(“%d”,a0a1a2a3a4a5,471905,4,4,7,9,1,0,二、二维数组与指针,二维数组的定义,对于二维数组a,首先可以把它先理解为一个一维数组,它有3个元素:a0,a1,a2,而每一个元素又是一个一维数组,包含4个元素如a0是一维数组,它有4个元素:a00,a01,a02,a03,a34,a0,a1,a2只是一种地址表示方法,并不真的二维数组元素,可以看作是第二重一维数组的名字。,二维数组的初始化,(1)可以分行给二维数组赋初值,inta34=1,2,3,4,5,6,7,8,9,10,11,12;,1234,5678,9101112,(2)可以将所有数据写在一个花括号中,按顺序对各元素赋初值,inta34=1,2,3,4,5,6,7,8,9,10,11,12;,二维数组的初始化,(3)可以对部分元素赋初值,其余元素补0,inta34=1,5,9;,inta34=1,0,6,0,0,11;,(4)如果对全部数据都赋初值,则定义时第一维的长度可以不指定,但第二维的长度不能省,inta4=1,2,3,4,5,6,7,8,9,10,11,12;,二维数组的初始化,如果只对部分数据赋初值,第一维的长度也可以不指定,但元素必须分行赋初值,inta4=0,0,3,0,10;,二维数组的地址,二维数组名a表示二维数组的首地址,也是第0个元素(a0)的地址,a+1代表第1个元素(a1)的地址a+1p=,#includevoidmain()inta34=1,2,3,4,5,6,7,8,9,10,11,12;int*p;,for(p=a0;pa0+12;p+)printf(“%d”,*p);printf(“n”);,指向二维数组元素的指针,inta34;int*p;p=a;合法吗?,intx=36,*q,*p;q=,2010,2026,p是二级指针,它指向一个整型指针变量q,而q指向一个整型变量,a是一种地址表示方法,a实际指向了第一重一维数组元素a0,而a0是第二重一维数组,非法!,指向二维数组元素的指针,定义格式:类型名(*指针变量名)数组长度;,inta34;int(*p)4;p=a;,p指向一个包含有4个整型数据的一维数组,合法!,虽然在定义p的时候只用了一个*,但p实际上是一个二级指针变量,指向二维数组元素的指针,例2:输出二维数组中的元素,#includevoidmain()inta34=1,2,3,4,5,6,7,8,9,10,11,12;int(*p)4,i,j;p=a;for(i=0;i3;i+)for(j=0;j4;j+)printf(“%6d”,*(*(p+i)+j);printf(“n”);,指向二维数组元素的指针,二维数组用得较多的是“字符串数组”,配合字符串的操作,使字符串处理更加方便、灵活。,chara4256=Pascal,VC,Basic,Java;,Pascal,Vc,Basic,Java,#include#include#defineMAXLEN256#defineN4voidmain()inti,j;chartempMAXLEN;charnameNMAXLEN=Pascal,VC,Basic,Java;for(i=0;iN;i+)puts(namei);,/书的数量,for(i=0;i0)strcpy(temp,namei);strcpy(namei,namej);strcpy(namej,temp);,选择法排序,/书名的最大长度+1,指向二维数组元素的指针,比较两个字符串大小,复制字符串,Quiz选择法排序,Assignment,1、将数组a23中的每个元素向右移一列,最后一列换到最左一列(如右图所示)要求:必须用指针实现,2、将数组aMN中的每个元素向右移一列,最后一列换到最左一列要求:必须用指针实现,Experiment,实验题目:指向二维数组的指针编程实验目的:深入理解如何用指针变量表示二维数组的元素和元素的地址,学会用指向二维数组的指针变量作函数参数实验内容:编程找出二维数组中的鞍点,二维数组的鞍点是指在该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点。要求必须用指针实现。编写一个找鞍点的函数,用指向二维数组的指针变量作函数参数,6.4指针与字符串,一、字符指针1.定义指向字符串的指针变量char*p=“China”;说明:这里没有定义字符数组,但字符串在内存中还是以数组形式存放的.字符串在内存中占有一片连续的存储单元,以0结束,注意:赋值只是把字符串的首地址赋给p,而不是把字符串赋给p,p是一个指针变量,它不能存放一个字符串,只能存放一个地址,246024612462246324642465,将字符串的首地址赋给p,2.输出字符串:printf(“%sn”,p);输出字符串时,先输出p指向的第一个字符,然后系统自动执行p+,使p指向下一个字符,再输出该字符,直到遇到0为止也可以用循环逐个输出字符串中的字符:for(;*p!=0;p+)printf(“%c”,*p);,24602461246
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 天然气施工方案范本
- 电子设备手工装接工技能操作考核试卷及答案
- 酱油酱类制作工5S管理考核试卷及答案
- 高考语文第二模拟考试试卷及详解
- 清洁服务行业心理素质培训需求分析报告
- 木片3D打印材料技术专利分析报告
- 生产进度控制策略分析报告
- 养老中心运营管理方案
- 甲烷合成气净化工5S管理考核试卷及答案
- 摩托车屏幕亮度标准分析报告
- 2025-2030滑雪培训行业市场发展分析及前景趋势预测与投资可行性评估报告
- 课堂高效学习的主阵地 教学设计-2023-2024学年高中上学期主题班会
- 2025年放射工作人员培训考试试题(附答案)
- 高考熟词生义解密(复习讲义)-2026年高考英语一轮复习(北京专用)挖空版
- 2025年陕西省专业技术人员继续教育公需课答案
- 2025年北京市中考英语试卷(含答案与解析)
- 浙江名校协作体(G12)2025年9月2026届高三返校联考英语(含答案)
- 2025年环保法律法规基础知识考试卷及答案
- 2026届新人教版高考物理一轮复习讲义:静电场及其应用(含答案)
- 检测基础知识培训课件
- 采购管理大师谢勤龙讲义《供应链管理的问题多多与解决之道》
评论
0/150
提交评论