欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    c语言课件第10章指针1011.ppt

    • 资源ID:1284232       资源大小:343.04KB        全文页数:77页
    • 资源格式: PPT        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    c语言课件第10章指针1011.ppt

    第十章 指 针,掌握指针与指针变量的概念; 掌握数组的指针和指针数组的使用;掌握字符串指针和指向字符串的指针变量的使用; 掌握指针函数和函数指针的使用;了解指向指针的指针的概念及其使用。,第十章 指 针掌握指针与指针变量的概念;,预 备 知 识,内存:CPU处理的数据都保存在内存中。内存分为一个个单元,这些单元顺序排列,每一个单元有一个称为内存地址的编号,对内存数据的访问都是通过地址进行的。高级语言用变量等高级概念把内存单元、地址等低级概念掩盖起来,使我们在写程序时不必关心硬件的细节,但内存与地址仍是最基本的概念。存储单元的最小单位是字节。,1. 内存的概念,预 备 知 识内存:CPU处理的数据都保存在内存中。内存分为,地址:为了对内存中的某个存储单元进行访问,要为它编号,这种编号称为内存地址。 通过地址我们就能够访问该地址所标识的存 储单元。,2. 地址的概念,地址:为了对内存中的某个存储单元进行访问,要为它编号,这种编,变量的地址:每一个变量在内存中总占用几个连续的 字节,开始字节的地址,就是变量的地址。,2007,存储单元,变量的地址:每一个变量在内存中总占用几个连续的2007存储单,10.1 指针及其相关概念,指针:一个变量的地址称为该变量的指针。许多高级语言都把程序对象的地址作为一种数据,称之为地址值或指针值。指针变量:若一个变量专用于存放另一个变量的地址(指针),则该变量称为指针变量。换句话说,以地址为值的变量称为指针变量,简称指针。,10.1 指针及其相关概念 指针:一个变量的地址称为该变量,指针的对象:当把变量的地址存入指针变量后,我们就可以说这个指针指向了该变量。,变量的存取方法:直接存取和间接存取。,指针的对象:当把变量的地址存入指针变量后,我们就可以说这个指,10.2 变量的指针和指向变量的指针变量,一、指针变量的定义,例如: int *ptr1, *ptr2;,指针变量的类型:说明该指针所指向的变量的类型。,在定义指针变量时要注意以下几个问题:, 变量名ptr2前面的“*”不能省略,如果写成 int *ptr1, ptr2; 则ptr2被定义为整型变量,而非整型指针变量。,10.2 变量的指针和指向变量的指针变量一、指针变量的定义,定义中的“*”表示所定义的变量是指针变量,但 指针变量名是ptr1、ptr2,而非*ptr1、*ptr2。,指针变量只能指向定义时所规定类型的变量。 这个规定的类型称为该指针变量的“基类型”。,如:上例中ptr1、ptr2只能指向整型变量,不 能指向实型或字符型变量。其“基类型” 相同,都是整型。,定义指针变量后,并未确定该变量指向何处。 也就是说该变量的值是不确定的。在引用指针 变量前必须首先让它指向一个变量,这一点非 常重要。,定义中的“*”表示所定义的变量是指针变量,但指针变量只能,二、指针变量的运算, 指针运算符(“&”和“*” ),“&”(取地址运算符) :取变量的存储地址,“*” (取值运算符) :取指针所指向变量的内容,例如:&a 是求变量a的地址。,tr指向了i变量,*ptr表示i的值,即3,二、指针变量的运算 指针运算符(“&”和“*” ) “&,我们还可以用这种方法实现对变量的改变:,*ptr=15 ; 等价于 i=15 ;,由此可见:通过指针运算符“*”可以引用一个变量。如:当ptr已经指向变量i后,*ptr就等同于i。,我们还可以用这种方法实现对变量的改变: *ptr=15 ;,*ptr,&i,进一步理解“&”和“*”:,“&”运算和“*”运算是一对互逆运算。 &*ptr &i ptr *&i *ptr i,等价于,*ptr&i进一步理解“&”和“*”:“&”运算和“*”运算, 指针的赋值运算(=),指针的赋值运算:就是把地址赋值给指针变量。,指针的赋值运算可以是以下三种方式:,使用取地址运算符,把地址值赋值给指针变量。,如:int i, *pi ; pi=,把指针变量的值赋给另一个指针变量。,如:int i,*pa,*pb; pa=,给指针变量赋值为符号常量NULL。,说明:NULL是一个空指针,表示该指针变量的值没有意义。作用是为了避免对没有被初始化的指针变量的非法引用。NULL 的定义在“stdio.h”中。,如:int *pi ; pi=NULL ;, 指针的赋值运算(=) 指针的赋值运算:就是把地址赋值给指,说明:,在定义指针变量时,可以立即将一个地址值 赋给指针变量,这就是指针变量的初始化。 指针变量的初始化也是指针的赋值运算。,如:float flt,*f_ptr=,注意:这不是给*f_ptr赋值 。,指针变量间的赋值和引用应保证基类型相同。,若有定义: int *p , i ; float *q , x ;,则:q= ,说明:在定义指针变量时,可以立即将一个地址值如:float, 移动指针的运算,1指针的+、运算,说明:,指针与整型值加减的结果是指针,表示使该指针指向该指针下移或上移存储单元个数(整型值)之后的内存地址。存储单元的大小就是该指针的数据类型所需的内存大小。,例如:ptr+n (指针ptr,n为整数)这个指针值代表的内存单元的地址是:ptr+n*d(其中d是指针所指向变量的数据类型所占内存字节数),即指针移动了n个元素。, 移动指针的运算 指针的加减运算(+、) 指针的自加,指针与指针的加运算毫无意义,所以指针与指针 没有加运算。,指针与指针的减运算要求相减的两个指针属于同 一类型,其结果是整数,表示两个指针之间的数 据的个数。其结果值的计算公式是:,tr1-ptr2=(ptr1的值- ptr2的值) /指针的数据类型所占的字节数,例如: int *ptr1,*ptr2,*ptr3,x; int ary5=2,4,8,16,32; ptr1 = ,x 的值是3,指针与指针的加运算毫无意义,所以指针与指针指针与指针的减,2指针的+、 -、+=、-= 运算,+、 += :是移动指针到下一个或下几个存储单元。,-、 -= :是移动指针到上一个或上几个存储单元。,例如:int *ptr, ary5=2,4,6,8,10 ; ptr=ary; ptr+=3; ptr-;,想一想:*ptr+和(*ptr)+有什么区别 ?,2指针的+、 -、+=、-= 运算 +、 += :是,关系运算,基类型相同的两个指针进行比较运算,其意义是两个指针的位置比较,结果是逻辑值。,指针运算的程序举例:把a,b按大小顺序输出。,main() int *p1,*p2,*p,a,b; a=45;b=76; p1=,输出结果:a=45,b=76,max=76,min=45,关系运算 基类型相同的两个指针进行比较运算,三、指针变量作为函数参数,指针可以用作函数参数,这在调用函数希望改变参数的值时非常有用。,例如:用指针变量编写实现两个数的交换的函数,void swap(int *p1, int *p2); main() int x1=100,x2=200; printf(x1=%d,x2=%dn,x1,x2); swap(,void swap(int *p1, int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp; ,三、指针变量作为函数参数 指针可以用作函数参,图示交换过程中存储单元内容的变化:,1,2,3,4,5,6,图示交换过程中存储单元内容的变化:123456,想一想:如果函数的参数不用指针而用整型变量 ,能否实现值的交换?为什么?,通过函数调用得到n个要改变的值的方法:,在主调函数中设n个变量,用n个指针变量指向它们;,将指针变量作实参,将这n个变量的地址传给所调用 的函数的形参;,通过形参指针变量,改变该n个变量的值;,主调函数中就可以使用这些改变了值的变量。,注意:不能企图通过改变指针形参的值而使指 针实参的值改变。 如:上例swap函数中不能写成: temp=p1; p1=p2; ;p2=temp;,想一想:如果函数的参数不用指针而用整型变量 ,能否实现值的交,10.3 数组的指针和指向数组的指针变量,一、概念,数组的指针 :是数组的起始地址。数组元素的指针 :是数组元素的地址。当指针变量指向数组或数组元素时,它就是指向数组的指针变量。,C规定:,数组名代表数组的首地址(起始地址),也就是数组第一个元素的地址。,10.3 数组的指针和指向数组的指针变量 一、概念 数组的,当指针变量p指向数组的某个元素时,p+1指向数组的下一个元素。假设一个整型元素占两个字节,p+1是使p的地址加2个字节。,如:int a10,*p ; 则:p=a ; 与 p=等价称指针变量p指向数组元素a0,+i、a+i 、&ai 都是ai的地址。,当指针变量p指向数组的某个元素时,p+1指向数组的下一个元,二、数组元素的引用,1. 用下标法引用数组元素,如:a3=45; b25=200;,2. 用指针法引用数组元素,假如: int a10, *p, i ; p=a;,则:*(p+i)、*(a+i)则代表元素ai, *(p+i)也可以写成pi, *(p+i)、*(a+i)、ai、pi 等价, 都代表数组a的第i+1个元素。,二、数组元素的引用 1. 用下标法引用数组元素如:a3=,程序举例:输出10个元素数组中的全部元素。,方法二:通过数组名计算数组元素地址,找出元素的 值。 main() int a10=54,65,8,2,3,56,8,21,57,98,i; for(printf(n),i=0;i10;i+) printf(%4d,*(a+i); ,方法一:下标法。 main() int a10=54,65,8,2,3,56,8,21,57,98, i; for(printf(n),i=0;i10;i+) printf(%4d,ai);,程序举例:输出10个元素数组中的全部元素。方法二:通过数组名,方法三:用指针变量指向数组元素 main() int a10=54,65,8,2,3,56,8,21,57,98,*p,i; p=a; for(printf(n),i=0;i10;i+) printf(%4d,*p+);,以上三种方法,利用指针变量效率最高。,说明:指针变量与数组名的区别:,指针变量是地址变量,数组名是地址常量。即指针变量的内容可以在程序运行过程中被改变;而数组名一旦被定义,它的地址就不能再改变了。,例如: int i, *p, a6; 则:p=,不能给常量赋值,方法三:用指针变量指向数组元素 以上三种方法,利用指针变量效,利用指针变量编程时特别要注意指针变量 的当前值。,例如:通过指针变量输入输出a数组元素。main() int *p,i,a10; p=a; for(i=0;i10;i+) scanf(%d,p+); printf (“n”); for(i=0;i10;i+) printf(“%6d”,*p+); ,应插入语句 p=a;,注意:*p+、*(p+)、(*p)+、*(+p)的含义,利用指针变量编程时特别要注意指针变量例如:通过指针变量输入,三、数组名作函数的参数,例如: f(int arr,int n) main() int array10; f(array,10); ,现在解释: 实际上,能够接受并存放地址值的只能是指针变量。因此,C编译系统都是将形参数组名作为指针变量来处理的。上例中f(int arr ,int n) 等价于 f(int *arr, int n) 。arri=*(arr+i),使用形参数组的概念只是为了与实参数组对应,直观,便于理解而已。,三、数组名作函数的参数 例如:现在解释: 使用,例:从10个数中找出其中最大值和最小值(用数组)。,main() void max_min(int a,int n,int *max,int *min); int i,a=2,4,1,6,7,32,45,75,45,90,max,min; printf(The original array=); for(i=0;iai) *min=ai; ,例:从10个数中找出其中最大值和最小值(用数组)。 main,上例中如果形参数组用指针变量,则程序如下:,main()void max _min(int *x,int n,int *max,int *min); int i,a10=2,4,1,6,7,32,45,75,45,90,max,min; for(printf(The original array=),i=0;i*x) *min=*(x+i); ,上例中如果形参数组用指针变量,则程序如下: main(),数组名做函数参数小结:,注意:用指针变量作实参时一定要有确定的值。,数组名做函数参数小结: 如果有一个实参数组,想,例a:实参和形参都用数组名,main() int a10; f(a,10); ,f(int x, int n) ,例b:实参用数组名,形参用指针变量,main() int a10; f(a,10); ,f(int *x, int n) ,例a:实参和形参都用数组名main()f(int x,例c:实参、形参都用指针变量,main() int a10,*p; p=a; f(p,10); ,f(int *x, int n) ,例d:实参为指针变量,形参用数组名,main() int a10,*p; p=a; f(p,10); ,f(int x , int n) ,例c:实参、形参都用指针变量main()f(int *x,本章程序举例:,习题10.1:输入3个整数,按由小到大的顺序输出。,void swap(int *p, int *q);main() int a,b,c,*p1 =,本章程序举例:习题10.1:输入3个整数,按由小到大的顺序输,习题10.14:将n个数按输入时顺序的逆序排列,用 函数实现。,void inverse(int *a,int n);main() int i,a10=2,4,1,6,7,32,45,75,450,89; for(puts( ), i=0;i10;i+) printf(%5d,ai); inverse(a,10); for(puts( ), i=0;i10;i+) printf(%5d,ai);void inverse(int *x,int n) 0 1 2 3 4 5 6 7 8 9 int *i=x,*j=x+n-1,t; for(;ij;i+,j-) t=*i; *i=*j; *j=t; *i *j,习题10.14:将n个数按输入时顺序的逆序排列,用void,10.4:有N个数,使前面各数顺序向后移M个位置。,main()int num20,m,n,i;printf(nm= n=); scanf(%d%d, ,10.4:有N个数,使前面各数顺序向后移M个位置。 main,作业(均要求用指针实现)(1)任意输入5个整数,按由大到小的顺序输出;(2)写一个函数 select(int n, double a, double b, double x) ,它将数组b中大于x的数顺序复制到数组a中。 a数组的内容为空,n是两个数组的大小。,作业(均要求用指针实现),四、二维数组的指针,1二维数组的地址概念,在C语言中,一个二维数组可以看成是一个一维数组,该一维数组中的每个元素又是一个包含若干元素的一维数组。,假如有定义:int a34;,则C语言编译程序认为a数组是由a0,a1,a23个元素组成的一维数组,而a0和a1,a2又分别是包含4个元素的一维数组名,分别代表a数组元素的起始地址(即a0是第0行元素的首地址,a1是第1行元素的首地址)。因此,a和ai是两个基类型不同的指针常量。,四、二维数组的指针 1二维数组的地址概念,2通过地址引用二维数组元素,假如有定义: int a34, i,j ; (其中0i 3, 0j 4),则:ai和*(a+i)(无条件等价)都是第i行数组的首地址,也是第i行第0列(第1列)元素的地址;那么ai+j、*(a+i)+j、&a00+4*i+j都是第i行第j列元素的地址。,数组a中任意元素aij的引用可以表示成如 下几种形式: aij、*(ai+j)、*(*(a+i)+j)、(*(a+i)j、 *(&a00+4*i+j ),2通过地址引用二维数组元素假如有定义: int a3,二维数组的数组元素(一维数组)的首地址的运算(各班长的地址的运算),int a34首地址数组元素a(排长)a0*(a+0) a00 a01 a02 a03a1*(a+1) a10 a11 a12 a13a2*(a+2) a20 a21 a22 a23,排0班1班2班,二维数组一维数组,班长战士,二维数组的数组元素(一维数组)的首地址的运算int a3,一维数组的数组元素及地址运算(各班战士及地址运算),0班长地址a0*(a+0) 0班j战士的地址 *(a+0) +j0班j战士 *(*(a+0) +j) | a00 a01 a02 a03 1班长地址a1*(a+1) 1班j战士的地址 *(a+1) +j1班j战士 *(*(a+1) +j) | a10 a11 a12 a13 2班长地址a2*(a+2) 2班j战士的地址 *(a+2) +j2班j战士 *(*(a+2) +j) | a20 a21 a22 a23,一维数组的数组元素及地址运算0班长地址a0*(a+,3通过一个行指针变量引用二维数组的元素,例如:假若有语句 int a34, (*p)4; p=a;,注意:*p两侧的圆括号不可缺少。,则: p是一个指针变量,它指向由4个整型元素组成的一 维数组。,3通过一个行指针变量引用二维数组的元素,例:使用行指针变量访问九九乘法表的数组元素。,main() float fa99, (*pf)9=fa; int i,j; for(i=0; i9; i+) for(j=0; j=i; j+) *(*(pf+i)+j)=(i+1)*(j+1); for(i=0;i9;i+) for(j=0;j=i;j+) printf(“%f”,faij); /或者 printf(%f, *(*(pf+i)+j);,例:使用行指针变量访问九九乘法表的数组元素。main(),习题10.9:写一函数,将一个33的矩阵转置。,main() int a33=1,2,3,4,5,6,7,8,9,i,j; for(i=0;i3;i+) for(puts(), j=0; j3; j+) printf(%6d,aij); transpose(a); for(i=0;i3;i+) for(puts(), j=0; j3; j+) printf(%6d,aij);transpose(int (*p)3) int i, j, t; for(i=0; i3; i+) for(j=0; ji; j+) t=*(*(p+i)+j);*(*(p+i)+j)=*(*(p+j)+i); *(*(p+j)+i)=t; ,习题10.9:写一函数,将一个33的矩阵转置。main(),10.4 字符串指针和指向字符串的指针变量,字符串指针:字符串的首地址。,字符指针变量:指向字符串的指针变量。,字符指针变量定义时可以赋初值。,10.4 字符串指针和指向字符串的指针变量 字符串指针:字,C程序访问字符串有以下两种方法:,1 用字符数组存放一个字符串,例如:char s =I am a student.;,字符串输出语句可写成: printf(“%sn”,s); for(i=0; si!=0; i+)printf(“%c”, si); for(i=0; si!=0; i+)printf(“%c”,*(s+i);,2用字符指针指向一个字符串,例如:char *ps=I am a student.;,字符串输出语句可写成: for(; *ps!=0; ps+)printf(“%c”, *ps);,C程序访问字符串有以下两种方法: 1 用字符数组存放一个字,说明:,字符数组由若干个元素组成,每个元素中放一个字符。而字符指针变量中存放的是地址(字符串的首地址),决不是将字符串放到字符指针变量中;,字符数组和字符指针变量都可以在定义时赋初值,但以下方法对字符数组非法,对字符指针变量合法:,说明:字符数组由若干个元素组成,每个元素中放一个字符。而字,字符数组名是指针常量,表示一个字符串的首地址,该地址不能改变。而字符指针变量的值是可以改变的,它可以代表不同的字符串。,若定义了一个指针变量使它指向一个字符串,就可以用下标形式引用指针变量所指字符串中的字符。,如:char *a=“I love China!”;printf(“%c”,a5);,字符数组名是指针常量,表示一个字符串的首地址,该地址不能改,程序举例:将字符串a复制为字符串b。,main() char a=I am a boy., b20; int i=0; do *(b+i)=*(a+i); i+; while(*(a+i)!=0);puts(b); ,程序举例:将字符串a复制为字符串b。main(),上例程序还可写成:,main() char a=I am a boy., b20,*p1=a,*p2=b; int i=0; while(*p2=*p1)!=0) p2+;p1+; puts(b);/或者 while(*p2+=*p1+)!=0),上例程序还可写成:main(),10.5 指针函数和函数的指针,一、指针函数,返回指针的函数称作指针函数 。,含意:函数的返回值是一个指针,它指向所定 义类型的数据 。,例如:int *a(int x, int y) ; /*函数原型声明*/含意:a是函数名,调用它以后能得到一个指 向整型数据的指针(地址)。,10.5 指针函数和函数的指针 一、指针函数 返回指针的,例: 编写能返回结果串地址的串拷贝函数。,#include stdio.h main() char *strcpy1(char* str1,char*str2); char *ps, s180=yhhhj; ps=strcpy1(s1,fdgjdfh); puts(ps); char *strcpy1(char *str1,char *str2) char *s=str1; while(*str2) *str1+=*str2+; *str1=0; return s; ,例: 编写能返回结果串地址的串拷贝函数。 #include,二、函数的指针及指向函数的指针变量,1. 函数的指针(地址)概念,每一个函数都占用一段内存,在编译时,被分配一个入口地址,这个入口地址就称为函数的指针。,2. 指向函数的指针变量,例如:float (*p)( ); 含意:定义了p是指向函数的指针变量,函数 的返回值是float类型。,二、函数的指针及指向函数的指针变量1. 函数的指针(地址)概, (*p)()表示定义一个指向函数的指针变量,它不是固定指向哪个函数。,3. 对指向函数的指针变量赋值,将一个函数的函数名(代表入口地址)赋值给指向函数的指针变量,也称该指针变量指向了这个函数。,如: int max(int x,int y);/*函数的原型声明*/ int (*p)(); p=max;,注意:赋值时,只需给出函数名而不必给出参数。,注意:, 对指向函数的指针变量,p+n, p+, p- - 等运算是无意义的。, 注意区别 int (*p)( )、int *p( ), (*p)()表示定义一个指向函数的指针变量,它不是固定指,4. 函数的调用,例如:若有定义 int max(int x,int y); int (*p)() ,a,b,c ; p=max; 则可有语句 c= (*p) (a,b) ;,4. 函数的调用 函数的调用通过函数名调用函数 通过指向函数,例: 求a和b中的大者 。,main() int max(int,int); int (*p)();/*指向函数的指针*/ int a,b,c; p=max; scanf(“%d,%d”, ,例: 求a和b中的大者 。 main(),10.7 指针数组和指向指针的指针,一、指针数组,指针数组:就是数组中每个元素是基类型相同 指针变量。,例如: int *p2; 含意:p是一个一维指针数组,每个元素都是 一个指向整型变量的指针变量。可以将 整型变量的地址赋值给元素p0或p1。,注意:区别 int *p2 、int (*p)2 的含意。,10.7 指针数组和指向指针的指针 一、指针数组 指针数组,二、指针数组的应用,1. 利用指针数组处理多个字符串,方法:先用指针数组指向字符数组, 再处理。,main() char name80=aaa,bbb,ccc,ddd,eee; char *pname10, i ; for(i=0;i5;i+)pnamei=namei; for(i=0;i5;i+)puts(pnamei);,main() /*与用行指针解决上述问题比较*/ char name80=aaa,bbb,ccc,ddd,eee; char (*pname)80=name, i ; for(i=0;i5;i+)puts(pnamei);,二、指针数组的应用 1. 利用指针数组处理多个字符串 方法,方法:用指针数组指向字符串常量。,main() char *pname10=aaa,bbb,ccc,ddd,eee; int i ; for(i=0;i5;i+)puts(pnamei); ,2. 用指针数组指向动态内存,void指针类型介绍:,ANSI新标准增加了void指针类型,它用于定义一个指针变量,但不指定它是指向哪种类型数据。在将它的值赋给另一个指针变量时要进行强制类型转换使之适合于被赋值的变量的类型。,方法:用指针数组指向字符串常量。 main(),例如: char *p1; int a=2; void *p2; p2=,强制类型转换,void指针变量定义,同样,可用 p2=(void *)p1; 将p1的值转换成void 指针类型。,可以将一个函数定义为void 指针类型。表示该函数返回的是一个地址,它指向空类型,如需要引用此地址,也需要根据情况进行类型转换。,如, 库函数:void *malloc(unsigned size); 功能:分配size字节的存储区。,函数调用例: char *p; p=(char *)malloc(60);,分配60字节的存储区,并返回该内存区的地址,并赋值给p 。,例如: char *p1; int a=2; vo,void sort(char *ps ,int n);#define N 5main() char *ps100,i; for(i=0;iN;i+) psi=(char*)malloc(60); for(i=0;iN;i+) gets(psi); sort(ps,N); for(i=0;iN;i+) puts(psi);,void sort(char *ps,int n) int i, k; char *p,s100; for(i=0;in-1;i+) for(k=i+1;kn;k+) if(strcmp(psi,psk)0) p=psi; psi=psk; psk=p; ,例:用指针数组指向动态内存,进行字符串的排序。,void sort(char *ps ,int n);,三、指向指针的指针变量,指向指针的指针变量(也称多级指针)只能存放指针变量的地址。,例如:int *q, *p, i=5;p=,注意:要使用一个多级指针指向目标值,必须连续使用指针运算符“*”。,例如:上例中*q就是i的值。,含意:使指针变量p指向i,指针变量q指向p。,三、指向指针的指针变量 指向指针的指针变量(也称多级指针),10.8 指针的数据类型小结,10.8 指针的数据类型小结 定 义含 义 in,习题10.2:输入3个字符串,按由小到大的顺序输出。,void swap(char *ps1,char *ps2);main() char s1=abc,s2=rst,s3=xyz; if(strcmp(s1,s2)0) swap(s1,s2); if(strcmp(s1,s3)0) swap(s1,s3); if(strcmp(s2,s3)0) swap(s2,s3); printf(n%10s %10s %10s,s1,s2,s3);void swap(char *ps1,char *ps2) char ps100; strcpy(ps,ps1);strcpy(ps1,ps2);strcpy(ps2,ps);,习题10.2:输入3个字符串,按由小到大的顺序输出。void,习题10.17:写一函数,实现两个字符串的比较。,main() char s1128,s2128; gets(s1); gets(s2); printf(cmps(s1,s2)=%d,cmps(s1,s2);cmps(char *s1,char *s2) while(*s1,习题10.17:写一函数,实现两个字符串的比较。main(),习题10.6:写一个函数,求字符串的长度,在main 函数中输入字符串,并输出其长度。,int len(char *ps);main() char str30; gets(str); printf(n len=%d,len(str); int len(char *ps) int n=0; while(*ps+) n+; return n; ,习题10.6:写一个函数,求字符串的长度,在mainint,习题10.7:有一字符串包含N个字符,写一个函数, 将字符串中从第M个字符开始的全部字 符复制成为另一个字符串。,main() char sn100=fasjfkjsdfsdfjsdjkfdfjssdf,sm100; int n=strlen(sn),m=n/2; scopy(sn,sm,m); printf(n sn=%s n m=%d n sm=%s,sn,sm,m); scopy(char *psn,char *psm,int m) while(*(psn+m) *psm+=*(m+psn+); *psm=0; ,习题10.7:有一字符串包含N个字符,写一个函数,main(,习题10.8:输入一行文字,找出其中大写字母、小 写字母、空格、数字以及其他字符各有多少?,main() char s100,*p; int lowc=0, upc=0, space=0, num=0; gets(s); p=s; while(*p) if(*p=A ,习题10.8:输入一行文字,找出其中大写字母、小main(),习题10.11:对10个等长的字符串排序并输出。,void sort(char (*p)60);main() char s1060,i; for(i=0; i0) strcpy(s,pi); strcpy(pi,pj); strcpy(pj,s); ,习题10.11:对10个等长的字符串排序并输出。 void,10.12:用指针数组处理上一个题目,字符串不 等长。,void sort(char *p ,int n);main() char *s10=AAA,DDD,878787,*ps10,i; for(i=0;i10;i+) psi=si; sort(ps,3); for(i=0;i3;i+) puts(psi);void sort(char *ps ,int n) int i, j; char *s; for(i=0;in-1;i+) for(j=i+1;jn;j+) if(strcmp(psi,psj)0) s=psi, psi=psj, psj=s;,10.12:用指针数组处理上一个题目,字符串不 等长。 vo,习题10.16:输入一个字符串,将其中的数字串转换 成数值送数组A。,main() char s128,*ps=s; int a100, i, n; gets(s); for(i=0,n=0;*ps;ps+) if(*ps=0 ,习题10.16:输入一个字符串,将其中的数字串转换main(,习题10.18:根据输入的月份输出月的英文名。,main() char *month=January,February,March, April, May,June,July, August, Septermber, October,Noverber, Decermber; int mon; scanf(%d,习题10.18:根据输入的月份输出月的英文名。 main(),作业(上机运行以下程序,要求使用指针),(1)写一函数,将一个34的矩阵转置,将数据存储到一个43的矩阵后,将两个矩阵输出;(2)输入3个字符串,按由小到大的顺序输出,要求不使用strcpy(string.h库函数)语句;(3)对n个等长的字符串排序并输出,n在210之间可变; (4)写出前述习题10.16各条语句的含义。(5)对习题10.5,写出各程序行或程序段的含义,并将“凡报到3的人退出圈子”修改为“凡报到5的人退出圈子”,上机运行该程序。,作业(1)写一函数,将一个34的矩阵转置,将数据存储到一个,State the following statements are true or false.判断下列说法是真还是假,A) Pointer variables are declared using the address operator.指针变量用地址运算符(&)来定义。B)The underlying type of a pointer variable is void.指针变量名不能使用下划线。C) Pointers to pointers is a term used to describe pointers whose contents are the address of another pointer.指向指针的指针是这样一种参数,它用于描述一种把其他指针的地址作为内容的指针。D) It is possible to cast a pointer to float as a pointer to integer.可以把float 型的指针指定为integer型的指针。,State the following statements,e) An integer can be added to a pointer.指针可以与一个整数相加 。f)A pointer can never be subtracted from another pointer.指针不能与指针相减。g) When an array is passed as an argument to a function, a pointer is passed.当把数组作为变量传递给一个函数时,就等于传递了一个指针。h) Pointers cannot be used as formal parameters in headers to function definition.进行函数定义时,函数头的形参不能使用指针。,e) An integer can be added to,Fill in the blanks in the following statements.,a) A pointer variable contains as its value the _ of another variable.b)The _ operator is used with a pointer to de-reference the address contained in the pointer.c) The _ operator returns the value of the variable to which its operand points. _ 操作符所返回的值是变量的操

    注意事项

    本文(c语言课件第10章指针1011.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开