欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    第十章-指针课件.ppt

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

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

    第十章-指针课件.ppt

    指针与指针变量的概念指针数据类型变量的指针和指向变量的指针变量数组的指针与指向数组的指针变量4指针与字符串5函数的指针与指向函数的指针变量6指针数组与指向指针的指针7小结指针-指针与指针变量的概念 导论:指针数据类型,是C语言中最具特色的数据类型。指针数据类型使得我们用户可直接对内存单元的地址进行操作,它与位运算的结合,可实现汇编语言中的低级功能,基于这个原因,把C语言称为中性语言。可以这样讲,学习C语言,如果不掌握指针数据的基本概念与应用,也就没有掌握C语言的精髓,也就是没有掌握C语言的特色。在本部分的内容中,我们将讨论指针的基本概念、指针与其它实体对象(变量、数组元素、函数)之间的间接访问关系。一指针与指针变量的概念 问题的引入:我们知道,在C程序中使用最频繁的赋值操作语句,涉及到对变量的操作,亦即对内存单元的操作。如:a=20*3则意味着通过变量名a换算到其对应内存单元的地址,通过地址找到其内存单元,完成赋值操作。指针-指针与指针变量的概念 又如:对于scanf(“%d”,&a);来讲,从键盘上键入的数据送到地址为“”&a”的内存单元中。也就说,对变量a所对应内存单元的操作是通过地址进行。可见,在C语言中,对变量进行读、写操作,其实质是对内存单元进行读、写操作,而对内存单元的操作是通过地址进行的。1指针与地址 把组成内存单元首字节所对应的地址值称为该内存单元的地址,亦即内存单元的指针,简称指针。指针的概念:例:short a;对于aFF7CFF7D则a变量地址FF7C亦即&aFF7C注意:对不同类型的内存单元,其编址的规则是相同的。也就是说,在32位编译系统中,内存单元的地址,即指针是用4个字节的二进制进行编码的。指针-指针与指针变量的概念记住:内存单元的地址是用4个字节的二进制进行编码,虽然指针值是整数形式,指针值的类型并非整型,而是指针型。若要将整数赋给指针变量,必须要进行强制的类型转换,即加(基类型名*)运算符。2地址值的获取 这里重要的概念是,指针值并不能由用户指定,而是通过取地址运算符“&”得到的。这样,“&变量名”为变量的地址,“&数组元素”为数组元素的指针。例:double d;char ch10;则:d变量的指针:&ach4的指针:&ch43指针变量 概念:存储内存单元的地址值,也就是存放指针的变量称为指针变量。注意:在C语言中,给指针变量分配4个字节的内存单元,来存放内存单元的指针。也就是讲,指针型变量的类型长度为4。变量的指针和指向变量的指针变量 问题的引入:通过前面的讨论可得出这样的结论:变量的指针就是变量的地址,存放变量地址的变量是指针变量,用来指向某一个变量,被指向的变量称为目标变量。引入指针变量的目的,是为了实现对目标变量的间接访问。要实现这种访问目的,不失一般性,要经过以下三个步骤过程。1指针变量的定义 格式:基类型标识符 *指针变量名;例:int *pa,*pb;意味着pa,pb用于存放int型变量的指针。例:double*pd1,*pd2;意味着pd1,pd2用于存放double型变量的指针。例:char*pc,c;意味着pc用于存放char型变量的指针。变量的指针和指向变量的指针变量考虑:printf(“%d,%d,%d”,sizeof(pa),sizeof(pd1),sizeof(char*);运行结果:4,4,4指针类型名记住:无论指针变量存放什么类型的指针,指针变量的长度都为4个字节。说明:在面述的指针变量定义格式中,基类型标识符是用于声明指针变量可以指向的类型,称为基类型。理解:在定义指针变量时,必须约定变量是存储什么类型的指针。如对于指针变量的定义:char*pc;意味着pc变量只能存储字符型的指针,而不能存储其它类型的指针,在这里把char称为基类型。在指针变量定义语句中,指针变量前的“*”,是用来说明它所标识的变量为指针变量,而“*”本身并非变量名的组成部分。强调:基类型不同的指针变量,在32位程序中其内存单元的长度都为4个字节。变量的指针和指向变量的指针变量2指向关系的确立 引入指针变量的目的,是为了通过指针变量来访问它所指向的目标变量。要达到这个目的,必须确立指针变量与目标变量之间的指向关系。必要性:指向关系确立的途径:指向关系确立的途径,只有一种方式,即将目标变量的地址值赋给指针变量。即:指针变量=目标变量的地址赋值的具体形式:实现赋值的具体形式有三种:指针变量的初始化形式;通过赋值表达式;形参与实参的结合方式。初始化形式:int a,*pa=&a;赋值表达式形式:int a,*pa;pa=&a;形参与实参结合形式:void fun(int*pa,int*pb);函数调用:fun(&a,&b);相当于:pa=&a pb=&b变量的指针和指向变量的指针变量实际上:*pa等价于*(&a)等价于a解释:这里的运算符“*”称为间接访问运算符,也称为“脱址”运算符。很显然是单目运算符,其运算对象要求为指针类型,运算结果可访问到指针所标识的内存单元。所以对指针变量的间接访问运算形式,可作为左值对象,也可作为表达式的操作数及函数的参数。4指针运算 在C语言中,对指针支持以下的算术运算:指针+N,结果为:指针+N*sizeof(基类型),类型为指针值。若指针指向的内存单元是连续的,则该结果是确定的,为后移N个内存单元的地址。例若有定义:int a10;char str20;则:&a2+3的值为:&a5*(&a2+3)等价于:a5同理:*(str+3)相当于str3变量的指针和指向变量的指针变量 指针-N,结果为:指针-N*sizeof(基类型),类型为指针值。若指针指向的内存单元是连续的,则该结果是确定的,为前移N个内存单元的地址。例若有定义:char str=“abcdefg”,*ps=str+strlen(str);则:*(&str4-2)相当于*(&str2)相当于str2则:puchar(*(ps-4)的结果:输出字符d 指针-指针,结果为整数。若指针指向的内存单元是连续的,结果为两指针间的内存单元个数。例若有定义:int a10;则:printf(“%d”,&a5-&a2)的结果为:3 指针变量的+和-运算,结果为指针类型。若指向的内存单元是连续的,则意味着指针的前移或后移。例若有定义:int a=1,2,3,4,5,*pa=a;则:pa+;printf(“%d”,*pa);的结果为:2变量的指针和指向变量的指针变量例 分析下述程序。void main()int*p1,*p2,x=10;float y=2.5;p1=&x;p2=&y;printf(%d,%fn,+(*p1),(*p2)+);本行有错,地址类型不匹配。加(int*)强制转换。解释为:+x与y+例 分析下述程序段。int x=10,*p;float y=2.4;x=y+;*p=x;*p+=x+y+;printf(%d,%fn,*p,y);本行出错,p无确定的指向。注意:输出结果不确定。对无确定指向指针的操作,要比对无确定值变量的操作危险得多。变量的指针和指向变量的指针变量例9.3利用指针完成两变量值的交换问题的引入:分析下列程序运行结果。#includevoid fun(int a,int b)int t;t=a;a=b;b=t;void main()int x=10,y=20;fun(x,y);printf(%d,%dn,x,y);结果:10,20分析当进行函数调用时,实参变量x,y与形参变量a,b分配独立的内存单元,结合时是将实参x赋给形参a,实参y赋给形参b,函数执行时,仅完成形参变量a,b的交换,对实参变量x,y无任何影响。变量的指针和指向变量的指针变量可见,要交换实参变量的值,必须提供通过对形参变量的访问,达到改变实参变量值的途径。该途径,要通过指针的间接访问来实现。#includevoid fun(int*a,int*b)int t;t=*a;*a=*b;*b=t;void main()int x=10,y=20;fun(&x,&y);printf(%d,%dn,x,y);结果:20,10指针变量a,b作函数的形参。对指针变量的间接访问实质是对其所指向目标的访问。与指针变量结合的实参,要求与基类型相同的指针值,且在结合时,确立了指针变量的指向关系。数组的指针与指向数组的指针变量 1数组的指针 数组的指针,是指数组元素对应内存单元的地址值。从更为细致的角度,将数组对应连续内存单元的起始地址值,称为数组的指针,它其实是数组中首元素的指针值。在这里,我们重点讨论一维数组、二维数组的指针表示方法。一维数组的指针 若有定义:类型说明符 数组名M;则一维数组的元素指针:“数组名”表示数组的起始指针,元素“数组名i”的指针为:“&数组名i”。由于数组元素对应内存单元是连续的,则根据指针算术的原则,元素“数组名i”的指针可表示为:“数组名+i”例:int a10;则a2的指针可表示为:&a2或:a+2这样,一维数组元素的访问形式有:数组名i 直接访问*(数组名+i)间接访问例*(a+2)数组的指针与指向数组的指针变量 二维数组的指针 若有定义:类型说明符 数组名MN;则二维数组的行指针(行起始指针):“数组名”表示的是首行的行指针值;“数组名+i”表示了偏移了i*N个元素后的指针值,即第“i”行的首地址;例,若有int a34则aa+2行指针另一等价的表示形式为“&数组名i”。结论:a与&a0、&a00等值;”a+1”与&a1、&a10等值;“a+2”与&a2、&a20等值。二维数组的元素“数组名ij”指针:原则:二维数组的元素指针指的是列指针在列方向上的偏移量,要表示元素指针的关键是将行指针转换为列方向上的指针值,转换方法为:在行指针左端加“*”运算符。a+1数组的指针与指向数组的指针变量所以,数组元素“数组名ij”的指针值可表示为:“i”行的行指针a+i转换为列指针*(a+i)加上列方向偏移量*(a+i)+j这样,其它等价形式为:ai+j;*a+i*N+j;*(&ai)+j 这样,二维数组的元素访问形式有:数组名ij 直接访问形式间接访问形式:*(*(数组名+i)+j);*(数组名i+j);*(*数组名+i*N+j);*(*(&ai)+j)变址运算符 “”在C语言中,是变址运算符。其运算形式为:指针整数i,含义可解释为:*(指针+i)。“”运算符的优先级为最高级别,结合方向为左结合性。这样:“*(*数组名+i*N+j)”与“(*数组名)i*N+j”等价,“*(*(数组名+i)+j)”与“(*(数组名+i)j”等价。数组的指针与指向数组的指针变量2指向数组的指针变量 引入指向数组的指针变量的目的,是为了完成对数组元素的间接访问。指向数组元素的指针变量 定义格式:基类型名 *指针变量名;说明:“基类型名”要求与指向数组的类型相同;指向一维数组元素的指针变量与指向二维数组元素的指针变量的定义相同。指向关系的确立:指针变量=数组元素的指针 若有定义:类型名 aM,*pa;类型名 bMN,*pb;(这里的标识符具有一般含义)。指向关系的确立:pa=a;pb=b;或pb=*b;或pb=b0;则ai与“*(pa+i)、pai”等价。bij与“*(pb+i*N+j)、pbi*N+j”等价。指向一维数组的指针变量(行指针变量)定义格式:基类型名 (*指针变量名)N;说明:“基类型”为要访问的二维数组类型,N的值与要访问的二维数组的二维大小一致。数组的指针与指向数组的指针变量注意:行指针变量与指向数组元素的指针变量虽然都能完成对数组元素的间接访问,但二者有着严格的区别。引入行指针变量的目的是为了完成对二维数组元素间接访问。另外,对行指针变量值进行移时,意味着一次移过“一个一维数组”的偏移量,相当于二维数组行方向上移动。例如,对于int a43;则a+2意味着在行方向上移过二行,得到第三行的首指针值,这与行指针变量的移动类似。这样,若有定义:基类型名 aMN,(*pa)N;确立指向关系:pa=a;则aij通过pa的间接访问形式为:*(pai+j)*(*(pa+i)+j)paij 例 以下程序段的输出结果是()。int a=5,8,7,6,2,7,3,y;int*p;p=&a1;y=(*-p)+;printf(%d,%d,%dn,y,*p,*p+);答案:5,8,6。(注意表达式的求值顺序)数组的指针与指向数组的指针变量数组名作函数的实参,则传递的是数组的起始地址值,则与之结合的形参必须是指向数组类型的指针变量。下面讨论数组名作函数的形参。一维数组名作函数的形参 函数定义的首部形式:类型名 函数名(类型名 数组名,)说明:一维数组名可作为函数的形参,在该形参定义中可缺省数组的大小。一维数组名作函数的形参,其形参定义:类型名 数组名,被解释为:类型名*数组名。一维数组名作函数的形参,与其结合的实参要求的是与指向数组元素的指针值。一维数组名作函数的形参,对应的实参可为二维数组元素的地址值。数组的指针与指向数组的指针变量例 二分查找法的函数模块,若查找失败,则函数的返回值为-1。假设数组元素为升序。int fun(double a,int n,double key)int top,bott,loca;top=0;bott=n-1;while(top=bott)loca=(top+bott)/2;if(keyaloca)top=loca+1;else return loca;return-1;对应的调用解释:double d10;fun(d,10,12);d为数组名,为数组的起始指针,它与形参a进行结合时,将其值赋给形参a。所以,只能将double a 解释为:double*a数组的指针与指向数组的指针变量例 矩阵相乘的函数模块。void mult(int*a,int*b,int*c,int m,int n,int l)int i,j,k;for(i=0;im;i+)for(j=0;jl;j+)*(c+i*l+j)=0;for(k=0;kn;k+)*(c+i*l+j)+=*(a+i*n+k)*(*(b+k*l+j);解释:int a34,b43,c33;mult(a,b,c,3,4,3);在调用时,形参a确立了与实参数组a之间指向关系,所以对ai,j元素的间接访问:*(c+i*4+j)。其它,道理相同。数组的指针与指向数组的指针变量(2)二维数组名作函数形数 函数首部的定义形式:类型名 函数名(类型名 数组名N,)说明:二维数组名作函数的形参,在定义时其一维大小可以缺省,但二维大小不能缺省。二维数组名的形参定义:类型名 数组名N,被解释为:类型名(*数组名)N。二维数组名作形参,其对应的实参要求是数组的行指针值。例 分析下述程序段的运行结果。int a34=1,2,3,4,3,4,5,6,5,6,7,8;int i,(*p)4=a,*q=a0;for(i=0;i3;i+)if(i=0)(*p)i+i/2=*q+1;else p+,+q;for(i=0;i3;i+)printf(%d,aii);答案:2,4,7,数组的指针与指向数组的指针变量例9.5程序清单:#define N 3void mator(int aN)int i,j;for(i=0;iN;i+)for(j=0;ji;j+)int t=aij;aij=aji;aji=t;#includevoid main()int i,j;int aNN=1,2,3,4,5,6,7,8,9;for(i=0;iN;i+)for(j=0;jN;j+)printf(%5d,aij);printf(n);mator(a);for(i=0;iN;i+)for(j=0;jN;j+)printf(%5d,aij);printf(n);printf(n);例 N阶方阵转置到自身的函数模块。指针与字符串2习题分析 例 分析下述程序的功能。#includevoid main()char*p,s80;while(strcmp(s,End)p=s;printf(input a string:);gets(s);while(*p)putchar(*p+);printf(n);答案:循环接收字符串并输出,直到输入“End”为止。(若将p=s;移出循环体外,如何?)确立指向关系输出字符串中各字符,注意指针的移动指针与字符串例 分析下述程序段的输出结果。char s=abcdefg,*p=&sstrlen(s);while(-p=s)putchar(*p);putchar(n);答案:gfedcba。(字符串的逆序输出)例 分析下列程序段的输出结果。char*s=this a program;while(*s-32)putchar(*s+-32);putchar(n);答案:THIS 指针与字符串例 分析下述程序段的输出结果。char*s=-12345;int k=0,sign,m;if(sk=+|sk=-)sign=sk+=+?1:-1;for(m=0;sk=0&sk=9;k+)m=m*10+sk-0;printf(Result=%dn,sign*m);答案:Result=-12345(将数字串转换为整数)。3字符型指针变量作函数的形参 字符型指针变量作函数的形参,与一维字符数组名作函数的形参是等同的。其对应的实参同样要求为字符型内存单元的地址值,一般传递的是字符串的首地址值。指针与字符串例9.6 两字符串连接的函数模块。char*stringcat(char*str1,char*str2)char*t=str1;while(*str1)str1+;while(*str2)*str1+=*str2+;*str1=0;return t;#include#includevoid main()char s180=123,s2=abcd;puts(stringcat(s1,s2);指针与字符串例9.7 两字符串复制的函数模块。char*stringcpy(char*str1,char*str2)char*str=str1;while(*str2)*str1+=*str2+;*str1=0;return str;#include#includevoid main()char s180=123,s2=abcd;puts(stringcpy(s1,s2);指针与字符串例9.8 两字符串比较的函数模块。int stringcmp(char*str1,char*str2)while(*str1=*str2&*str1&*str2)str1+,str2+;return*str1-*str2;#include#includevoid main()char s180=123,s2=123abcd;printf(%dn,stringcmp(s1,s2);指针与字符串例9.9 返回字符串串长的函数模块。int stringlen(char*str)char*p=str;while(*p)p+;return p-str;#include#includevoid main()char str=123a08bcd;printf(%dn,stringlen(str);指针与字符串例9.10 删除字符串中指定字符的函数模块。void stringdel(char*str,char ch)char*p=str;while(*p+)if(*p!=ch)*str+=*p;*str=0;#include#includevoid main()char str=*12*3*a*bc*;stringdel(str,*);puts(str);函数的指针与指向函数的指针变量 1函数的指针 一个函数在编译阶段在内存中被分配一个入口地址,这个入口地址就称为函数的指针。函数的指针可通过该函数名得到。2指向函数指针变量的定义 用来存放函数指针的变量,称为指向函数的指针变量。引入该指针变量的目的是为完成对目标函数的间接调用。指向函数指针变量定义的一般形式如下:类型标识符 (*指针变量名)(形参原型说明);说明:类型标识符是目标函数的返回值的类型。形参原型说明是目标函数的形参原型。对函数指针变量进行算术运算是没有意义的。如:double(*pf)(double,double,int);的意思为:定义指向函数的指针变量pf,其指向函数的返回值为double,且指向函数有三个参数,按从左到右的顺序为:double、double、int。函数的指针与指向函数的指针变量3确立指向函数的指针变量与目标函数之间的指向关系 确立指向函数指针变量与目标函数之间指向关系的途径是将目标函数的指针赋给所定义的指针变量,即:指向函数的指针变量=目标函数名。这是通过函数的指针来调用所指向目标函数的必要条件。4用函数指针变量调用目标函数 调用格式一:(*指向函数的指针变量)(实参表列)调用格式二:指向函数的指针变量(实参表列)使用场合:函数指针的调用与函数本身调用形式的使用场合完全相同。例:若有函数的原型声明:double fun(double,double,double);有定义:double (*pf)(double,double,double);pf=fun;则:fun()函数通过指针pf的调用形式为:(*pf)(实参1,实参2,实参3)函数的指针与指向函数的指针变量例 对下述程序段的功能进行分析。double fun(double(*u)(double),double(*v)(double),double x,double y)return(*u)(x+y)/(*v)(y-x);double val(double a,double b)return fun(sin,cos,a,b)*fun(cos,sin,a,b);分析:该程序段的功能是计算函数:的值函数的指针与指向函数的指针变量5用指向函数的指针变量作函数参数 函数指针变量的主要用途之一,是作为函数的形参,实现通用型编程目的。函数指针变量作函数的形参,其对应的实参为目标函数的指针值。算例 求定积分 的通用函数模块。梯形算法的公式:其中:abf(x)f(a+ih)h函数的指针与指向函数的指针变量例9.11定积分通用函数模块double integral(double(*pf)(double),double a,double b)double x,h,sum;int i,n=500;h=(b-a)/n;sum=0.5*(*pf)(a)+(*pf)(b);for(i=1;in;i+)sum+=(*pf)(a+i*h);return h*sum;double fun(double x)return x*x+5*x+6;#include#includevoid main()printf(%lfn,integral(fun,2,6);指针数组与指向指针的指针 1指针数组的概念 数组元素类型均为指针类型的数组,称为指针数组。指针数组可理解为由基类型相同的指针变量所组成的连续集合。一维指针数组的定义形式为:类型名 *数组名常量表达式;例:int *a10;相当于一次定义了10个指针变量,分别为a0,a1,a2,a9,也就讲,对于a数组的每个元素,其类型为指针型。2字符型指针数组 字符型指针数组是指针数组知识点中重点掌握的内容。讨论字符型指针数组的目的,是为了方便对多个字符串的操作。这种数据结构比二维字符数组对多字符串的操作要方便得多。例:若有定义char*p=“123”,”abcdefg”,”789qwer”;int i;则:上述三个字符串的输出操作为:for(i=0;isizeof(p)/sizeof(char*);i+)puts(pi);指针数组与指向指针的指针字符型指针数组的重要应用,是字符型指针数组名作函数的形参。它所对应的实参要求是字符型指针内存单元的地址值,不失一般性,为字符型指针数组的名,即字符型指针数组的起始地址值。例用字符型指针数组名作函数的形参,对若干字符串进行排序的函数模块。void sort(char*str,int n)char*t;int i,j,k;for(i=0;in-1;i+)k=i;for(j=i+1;j0)k=j;if(k!=i)t=strk;strk=stri;stri=t;注意,将char*str 解释为:char*str说明:指针数组交换的是指向关系,因此,其排序为逻辑排序。而字符数组的数据结构,其排序过程,交换的是字符串的存储,所以为物理排序。指针数组与指向指针的指针例9.12对上述结论的验证:void main()char str80=aaq,bab,9a,a12,d347;char*ps5;int i;for(i=0;i5;i+)psi=stri;/确立指向关系sort(ps,5);printf(排序前:n);for(i=0;i5;i+)puts(stri);printf(排序后:n);for(i=0;i5;i+)puts(psi);指针数组与指向指针的指针3指向指针的指针 指向指针的指针的概念 这个概念为二级指针的概念。二级指针所指向的目标,本身就是指针类型。最典型的是,若要将指针数组元素的地址,存放在另一个变量中,该变量就是指向指针的指针变量。因为,指针数组元素的类型是指针类型。指向指针的指针变量的定义:类型名 *指针变量名;关键的理解是,若二级指针变量p已确立了和某一指针变量之间的指向关系,该指向关系的确立,也是将指针变量的地址值,赋给二级指针变量p。则*p的值为指针值,*p才访问到指针的指针所指向的内存单元。例:char*s=“12345”,”abcdefgh”,*ps;ps=s;则:ps+1为s1的地址*(ps+1)访问到s1*(ps+1)访问到字符aputs(*(ps+1)结果:abcdefgh考虑:puts(*ps+1)的结果:2345指针数组与指向指针的指针例 分析下述程序段的运行结果。void main()char*str=One,Two,Three,Four;char*ptr=str;int i;for(i=0;isizeof(str)/sizeof(char*)-1;i+)printf(%s,(ptr+1)i);printf(n);答案:TwoThreeFour。(ptr+1的值为&str1,(ptr+1)i解释为*(ptr+1+i),即str1+i)指针数组与指向指针的指针例 若有以下程序段,则对相应的描述进行分析。int a43=0,*p4,*p,i,j;for(i=0;i0)printf(%s,argvargc);printf(n);假定上述程序经编译和连接后生成可执行文件prog.exe,如果在命令行提示符下键入PROG ABCD EFGH IJKL,则运行结果为:IJKLEFGHABCD.分析:命令行参数的个数为4,则形参argc得到的值为4。命令行上有四个用分格的字符串:PROG ABCD EFGH IJKL,组成了指针数组,分别存放这四个字符串的首地址,且形参argv接受到指针数组的首地址。这样,argv0将访问到PROG,argv1将访问到ABCD,argv2将访问到EFGH,argv3将访问到IJKL。小结 Dfund(int a,int n,int x)int k=0;do k+while(kn)&(ak!=x);if(ak=x)return k;else return 0;Bfunb(int*a,int n,int x)int k;for(k=1;k=n;k+)if(ak=x)return k;return 0;Cfunc(int a,int n,int x)int*k;a0=x;k=a+n;while(*k!=x)k-;return k-n;习题一:要求函数的功能是在一维数组a中查找x值。若找到则返回所在的下标值,否则返回0。数列放在a1到an中,不能正确执行此功能的函数是()。Afuna(int*a,int n,int x)*a=x;while(an!=x)n-;return n;C小结习题二:要求函数的功能是交换x和y中的值,且通过正确调用返回结果。能正确执行此功能的函数是()。Afuna(int*x,int*y)int*p;*p=*x;*x=*y;*y=*p;Bfunb(int x,int y)int t;t=x;x=y;y=t;Cfunc(int*x,int*y)*x=*y;*y=*x;Dfund(int*x,int*y)*x=*x+*y;*y=*x-*y;*x=*x-*y;D小结习题三:设有以下语句:char str1=“string”,str28,*str3,*str4=“string”;则对库函数strcpy的错误调用是()。Astrcpy(str1,HELLO!);Bstrcpy(str2,HELLO!);Cstrcpy(str3,HELLO!);Dstrcpy(str4,HELLO!);习题四:下面函数的功能是()。sss(char*t,char*s)while(*s)&(*t)&(*t+=*s+);return*t-*s;A求字符串的长度 B比较两个字符串的大小C将字符串s复制到字符串t中 D将字符串s接续到字符串t中 CB小 结习题五:下面各语句行中,能正确进行字符串操作的语句行是()。Achar st45=ABCDE;Bchar s5=A,B,C,D,E;Cchar*s;s=ABCDE;Dchar*s;scanf(%s,s);习题六:下面函数的功能是()。int fun(char*x)char*y=x;while(*y+);return(y-x-1);A求字符串的长度 B比较两个字符串的大小 C将字符串x复制到字符串y中 D将字符串x接续到字符串y中 CA小 结习题七:下面程序的输出是()。void fun(char*str)int i=0,j;char c;for(j=strlen(str)-1;ij;i+,j-)c=stri;stri=strj;strj=c;void main(int argc,char*argv)char*p=abcdefgh;fun(p);puts(p);Aabcdefgh Bhgfdecba Cdcbahgfe Dhgfedcba D小 结习题八:设有如下函数定义:int f(char*s)char*p=s;while(*p!=0)p+;return p-s;如果在main函数中用语句:printf(“%dn”,f(“goto0dbey!”);调用上面的函数,则输出结果为()A4 B10 C5 D12 习题九:设有如下一段程序:int*var,ab=100;var=&ab;ab=*var+10;执行上面的程序段后,ab的值为()。A120 B110 C100 D90 AB小 结习题十:下面程序的运行结果是()。sub(int x,int y,int*z)*z=y-x;void main(int argc,char*argv)int a,b,c;sub(10,5,&a);sub(7,a,&b);sub(a,b,&c);printf(%d,%d,%dn,a,b,c);A5,2,3 B-5,-12,-7 C-5,-12,-17 D5,-2,-7 习题十一:若有说明:int i,j=7,*p=&i;则与i=j等价的语句是()。Ai=*p;B*p=*&j;Ci=&j;Di=*p;BB小 结习题十二:设有说明int(*ptr)M,其中的标识符ptr是()。AM个指向整型变量的指针 B指向M个整型变量的函数指针 C一个指向具有M个整型元素一维数组的指针 D具有M个指针元素的一维指针数组,每个元素都只能指向整型量 C习题十三:若有说明:int w34=0,1,2,4,5,8;int(*p)4=w;则数值为4的表达式是()。A*w1+1 Bp+,*(p+1)Cw22 Dp11 习题十四:设有以下语句,则对a数组元素错误引用的是()。int a10=0,1,2,3,4,5,6,7,8,9,*p=a;Aap-a B*(&ai)Cpi D*(*(a+i)DD小 结习题十五:下面程序的输出结果是()。int a=2,4,6,8;void main(int argc,char*argv)int i,*p=a;for(i=0;i4;i+)ai=*p+;printf(%dn,a2);A6 B8 C4 D2 习题十六:下面程序的输出结果是()。void main(int argc,char*argv)int a5=2,4,6,8,10,*p,*k;p=a;k=&p;printf(%d,*p+);printf(%dn,*k);A4,4 B2,2 C2,4 D4,6AC小 结习题十七:若有说明语句:static int a23=2,4,6,8,10,12;则对数组元素地址的正确表示是()。A*(a+1)B*(a1+2)Ca1+3 Da00 习题十八:对于下述定义和赋值,且假设x和y连续,则对*p+判断正确的是()。int x=10,y=20;int*p=&x;A*p+是一个整数,值为10,计算*p+后,x值不变,但指针p自增1B*p+是一个整数,值为10,计算*p+后,x值自增1,但指针p不变C*p+是一个整数,值为11,计算*p+后,x值不变,但指针p自增1D*p+是一个整数,值为20,计算*p+后,x值不变,但指针p自增1习题十九:若有定义:int x=1,3,5,7,9,11,*ptr=x;则对数组元素错误的引用是()。A*ptr B*(ptr+4)C+ptr Dx2CAC

    注意事项

    本文(第十章-指针课件.ppt)为本站会员(知****量)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

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




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开