课件考点分析九指针_第1页
课件考点分析九指针_第2页
课件考点分析九指针_第3页
课件考点分析九指针_第4页
课件考点分析九指针_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

考点分析九 指针 1、地址和指针 考点1、变量的地址和指针变量的基本概念 机器的内存是以字节为单位的连续存储空间 ,每一个字节都有自己的编号,这些编号也是 连续的。字节的编号就是 “地址”。当定义一个 变量的时候, 编译系统会在内存中为变量分配 存储空间,被分配的存储空间所对应的编号就 是变量的地址。 在c语言中,不仅可以定义整型变量、实型 变量、字符型变量等,还可以定义一种特殊的 变量,专门用来存放其它变量的地址,我们将 它称为指针变量,简称指针。 根据指针变量的值(这个值是一个地址), 就可以访问其它的目标变量,*用来表示指针所 指向的目标变量。 考点2、指针变量的定义和赋值 定义指针变量的一般形式是: 数据类型 * 指针变量名; 说明:数据类型并不是指变量本身的类型, 而是该变量所指向目标变量的类型。 例如: int * p1; char * p2; p1 p2 这里存放的是一个整 型变量的地址。 这里存放的是一个字 符型变量的地址 给指针赋值有三种方法: 1、使用地址运算符 2、将一个已具有具体指向的指针变量赋值 给另一个指针变量。 接上例: int * p2; p2=p1; 说明:p1和p2同时指向变量a。 3、为指针赋空值。可以通过语句p=NULL为指 针变量p赋空值。 考点3、通过指针变量引用存储单元 当指针中存放了地址值时,可以通过指针操作 该地址中的数据。 1、使用取地址运算符可以得到一个变量的地址: 例如: int a; int score10=80,95,90,65,75,70,70,80,98,43; (1) a=a+1; *p1=321 ; *p1=*p1+1; a=321; 3、指针与整数相加减 指针与整数相加减表示指针的移动。 例如: p+n p-n p+ p- +p -p 其中n是整数。 进行加法运算时,表示p向地址增大的方向移动; 进行减法运算时,表示p向地址减小的方向移动。 移动的具体长度取决于指针的数据类型,由 计算机自动确定。 设p是指向type(type代表类型关键字)类型的指 针,n是整型表达式,则 pn 为一个新地址,其 值为pnsizeof(type),即在p原有值的基础上增 加或减少了nsizeof(type)字节。 4、两个同类型指针相减 两个同类型的指针可以相减。如果两个指针之 间所指向的目标变量数据类型相同(通常是数组的 情况),则相减的结果是这两个指针之间所包含的 数据个数。显然,两个指针相加是无意义的。 注意:*与+、-运算符结合使用时,这两个运 算符的优先级相同, 结合顺序是右结合性。 因此,请区分+*p和*p+的运算顺序。 2、指针变量与函数 *考点4、指针变量作函数参数 在函数的参数传递中,一种叫做传值调用,发 生传值调用时,主调函数把实参的值复制一份传 送给被调函数的行参,从而实现主调函数向被调 函数传送数据。但是行参的变化不会影响时参发 生变化。 另一种叫传址调用,所谓地址调用就是在函数 调用时,将实参数据的存储地址作为参数传递给 行参。 传址调用的特点是: 行参和实参占用同样的内存单元,函数中对行 参值的改变也会改变实参的值。因此,可实现主调 函数与被调函数之间数据的双向传递。 注意:由于行参和实参都必须是地址,通常将 行参定义为指针变量,当把变量的地址作为实参传 递给行参指针时,指针指向的变量就是实参变量, 从而实现数据的双向传递。 例: 利用函数调用交换两个整型变量的值: #include void main() void swap (int *x, int *y); int a=10,b=20; printf(“%d,%dn”,a,b); swap( printf(“%d,%dn”,a,b); void swap(int *x,int *y) int t; t=*x; *x=*y; *y=t; 第一条printf语句 输出10,20; 第二条printf语句 输出20,10。 考点5、指针作为函数返回值 在C语言里,允许一个函数的返回值是一个指 针(即地址),这种返回指针值的函数称为指针型 函数。定义指针型函数的一般形式为: 类型说明符 *函数名(行参表) 函数体语句; 其中:函数名前加了一个*号,表明这是一个 指针型函数,即返回值是一个指针。类型说明符表 示该指针指向的数据类型。 考点6、指向函数的指针 C语言规定, 一个函数总是占用一段连续的 内存区,而函数名就是该函数所占内存区的首地址 。可以给函数的这个首地址赋予一个指针变量,使 该指针指向该函数。然后通过指针变量调用该函数 。把这种指向函数的指针变量称为“函数指针变量” 。 函数指针变量定义的一般形式为: 其中,类型说明符表示被指向函数的返回值 类型,后面的参数表对应于被指向函数的行参。 类型说明符 (*指针变量名)(参数表); 例如:int (*pf)(int x); 这里定义了一个指向函数的指针变量pf,被指 向函数的返回值是整型,并且被指向函数有一个整 型行参。 3、指针变量与数组 *考点7、指向数组的指针 由于数组中各个元素的存储单元是连续分配的,因此 ,可以用指针访问数组,数组名就是该数组的首地址。 例如:int score10; score就为该数组的首地址,它等价于 int n=0; p=str; scanf(“%s“,str); while (*p!=0) n+; p+; printf(“%dn“,n); printf(“%s“,str); 考点8、指针数组 1、指针数组的概念 指针数组也是数组,但它和一般的数组不 同,其数组里面的元素值全部是其它变量的内 存单元地址,即指针。并且,这些指针必须指 向同一类型的变量。 2、指针数组的定义 数据类型 * 数组名 数组长度; 例如: char * p1 5; int * p2 6; 3、指针数组的使用 假设存在三个数组: char str1 =“China”; char str2 =“America”; char str3 =“German”; 那么可以用下面的语句定义指针数组并初始化: char *p 3=str1,str2,str3; str1 str2 str3 指针数组p p0 p1 p2 China0 Am erica0 German0 考点9、指向指针的指针变量 由于指针变量本身是一个变量,因此可以创建指向 指针的指针双重指针变量,其值为一个指针变量的 地址。 例如: int a=123; int *p_a= int *p= p_a是指向变量a的指针变量 p是指向变量p_a的指针变量 假设已经定义指针数组str。 char *str 3=“China”,“America”,“German”; str0 str1 str2 指针数组str China0 Am erica0 German0 很显然,str数组中的元素值是某一个字符串 的首地址,而数组str本身也占用内存空间,数组元 素str0、str1、str2有其自身的地址,因此,可以 利用指向指针的指针对字符串进行访问。 #include void main() char *str 3=“China“,“America“,“German“; char *p; int i; for (i=0;i void main(int argc, char *argv) int i; for (i=0;i main( ) int n,*p=NULL; *p= printf(“Input n:“); scanf(“%d“, printf(“output n:“); printf(“%dn“,p); 该程序试图通过指针 p为变量 n 读入数据并输出, 但程序有多处错误,下列语句正确 的是( )。 A)int n,*p=NULL; B)*p= C)scanf(“%d“, 8、有下列程序: main( ) int a=1, b=3,c=5,*p; int *p1= *p=*p1*(*p2); printf(“%dn“,*p); 执行后的输出结果是( )。 A)1 B)2 C)3 D)4 9、有下列程序: void f(int n, int *r) int rl=0; if (n%3= =0) r1=n/3; else if (n%5= =0) r1=n/5; else if(-n, *r = r1; main( ) int m=7, r; f(m, printf(“%d“, r); 程序运行后的输出结果是( )。 A)2 B)1 C)3 D)0 10、有下列程序: void f(int n, int *r) int rl=0; if (n%3= =0) r1=n/3; else if (n%5= =0) r1=n/5; else if(-n, *r = r1; main( ) int m=7, r; f(m, printf(“%d“, r); 程序运行后的输出结果是( )。 A)2 B)1 C)3 D)0 11、有下列程序: int add (int a,int b) return (a+b); main( ) int k,(*f)( ),a=5,b=10; f=add; 则下列函数调用语句错误的是( )。 A)k=(*f)(a,b); B)k=add(a,b); C)k=*f(a,b); D)k=f(a,b); 12、有下列程序: float fl(float n) return n*n; float f2(float n) return 2*n; main( ) float (*p1)(float),(*p2)(float),(*t)(float),y1,y2; p1=f1; p2=f2; y1=p2(p1(2.0); t=p1; p1=p2; p2=t; y2=p2(p1(2.0); printf(“%3.0f, %3.0fn“,y1,y2); 程序运行后的输出结果是( )。 A)8,16 B)8,8 C)16,16 D)4,8 13、设有定义:char p =1, 2, 3, *q=p;,下列不能 计算出一个 char型数据所占字节数 的表达式是( )。 A)sizeof(p) B)sizeof(char) C)sizeof(*q) D)sizeof(p0) 14、设有下列定义和语句 char str20=“Program“,*p; p=str; 则下列叙述中正确的是( )。 A)*p 与 str0的值相等 B)str与p的类型完全相同 C)str数组长度和 p 所 指向的字符串长度相等 D)数组 str中存放的内容和指针变量 p 中存放的 内容相同 15、在16位编译系统上,若有定义 int a =10,20,30,*p=,当执行p+ +;后,下列说法错误的 是( )。 A)p 向高地址移了一个字节 B)p 向高地址移了一个存储单元 C)p 向高地址移了两个字节 D)p 与 a+1等价 16、有下列程序: main( ) char s =“abcde“; s+ =2; printf(“%dn“,s0); 执行后的结果是( )。 A)输出字符 a 的 ASCII 码 B)输出字符 c 的 ASCII 码 C)输出字符 c D)程序出错 17、有下列程序: main( ) char s =“aeiou“ ,*ps; ps=s; printf(“%cn“,*ps+4); 程序运行后的输出结果是( )。 A)a B)e C)u D)元素 s4的地址 18、有下列程序: main( ) char ch =“uvwxyz“,*pc; pc=ch;printf(“%cn“,*(pc+5); 程序运行后的输出结果是( )。 A)z B)0 C)元素 ch5的地址 D)字符 y的地址 19、有下列程序: main( ) int a10=1,2,3,4,5,6,7,8,9,10,*p= printf(“%dn“,*p+*q); 程序运行后的输出结果是( )。 A)16 B)10 C)8 D)6 20、有下列函数: int fun(char*s) char *t=s; while(*t+ +); return(t-s); 该函数的功能是( )。 A)比较两个字符串的大小 B) 计算 s 所指字符串占用内存字节的个数 C)计算 s 所指字符串的长度 D)将 s 所指字符串复制到字符串 t 中 21、有下列函数: int aaa(char *s) char *t=s; while( *t+ +); t - -; return(t-s); 下列关于 aaa函数的功能的叙述正确的是( ) 。 A)求字符串 s 的长度 B)比较两个串的大小 C)将串 s 复制到串 t D)求字符串 s 所占字节数 22、有下列程序: main( ) int a =2,4,6,8,10,y=0,x,*p; p= for(x=1;x void fun(char *t,char *s) while(*t! =0) t+ +; while(*t+ + =*s+ +)! =0); main( ) char ss10=“acc“,aa10=“bbxxyy“; fun(ss,aa); printf(“%s,%sn“,ss,aa); 程序的运行结果是( ) 。 A)accxyy,bbxxyy B)acc,bbxxyy C)accxxyy,bbxxyy D)accbbxxyy,bbxxyy 29、有下列程序: #include void f(char *s,char *t) char k; k=*s; *s=*t; *t=k; s+ +; t-; if(*s) f(s,t); main( ) char str10=“abcdefg“,*p; p=str+strlen(str)/2+1; f(p,p-2); printf(“%sn“,str); 程序运行后的输出结果是( )。 A)abcdefg B)gfedcba C)gbcdefa D)abedcfg 30、下列程序中函数 f的功能是:当 flag为 1时,进行由 小到大排序;当 flag 为0 时,进行由大到小排序。 void f(int b ,int n,int flag) int i,j,t; for(i=0;ibj:bi void f(char *p ,int n) char *t; int i,j; for(i=0;i0)t=pi; pi=pj, pj=t; main( ) char *p5=“abc“,“aabdfg“,“abbd“,“dcdbe“,“cd“; f(p,5); printf(“%dn“,strlen(p1); 程序运行后的输出结果是( )。 A)2 B)3 C)6 D)4 34、有下列程序: main(int argc, char *argv ) int n=0, i; for (i=l; i main(int argc,char *argv ) int i=1,n=0; while (i void fun(char * *p) + +p; printf(“%sn“, *p); main( ) char *a =(“Morning“,“Afternoon“,“Evening“,“Night“); fun(a); 程序的运行结果是( ) 。 A)Afternoon B)fternoon C)Morning D)orning 37、若有定义语句:int a23,*p3;,则下列语 句中正确的是( ) 。 A)p=a; B)p0=a; C)p0= D)p1= 38、若有定义语句:int k23, *pk3;,则下列 语句中正确的是( )。 A)pk=k; B)pk0= C)pk=k0; D)pk1=k; 填空: 1 下列程序的功能:利用指针指向 3 个整型变量 ,并通过指针运算找出 3 个数中的最大 值,输出到屏幕上。请填空。 main( ) int x,y,z,max, *px, *py, *pz, *pmax; scanf(“%d%d%d“, px= py= pz= pmax= _ ; if(*pmax #include char *fun(char *t) char *p=t; return (p+strlen(t)/2); main( ) char *str=“abcdefgh“; str=fun(str); puts(str); 3 下列函数 fun 的功能是返回 str所指字符串中以 形参 c中字符开头的后续字符串的首地址,例如: str所指字符串为:Hello!,c 中的字符为 e,则函 数返回字符串:ello!的首地址。若 str所指字符串 为空串或不包含 c中的字符,则函数返回 NULL。 请填空。 char *fun(char *str,char c) int n=0; char *p=str; if(p! =NULL) while(pn! =c if(pn= = 0) return NULL; return( _ ); 4 下列程序运行后的输出结果是 _ #include char *ss(char *s) char *p,t; p=s+1;t=*s; while(*p)*(p-1)=*p;p+ +; *(p-1)=t; return s; main( ) char *p,str10=“abcdefgh“; p=ss(str); printf(“%sn“,p); 5 下列函数 sstrcat( )的功能是实现字符串的连接 ,即将 t所指字符串复制到

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论