聪智学校
{
int a[N]={1,2,3,4,5,6,7,8},i; fun(a,2); for(i=0;i 【解析】调用fun(a)函数,实参字符数组名a传递给形参字符指针s,使s指向字符串“good”;在函数fun中对字符串进行遍历,如果指针s指向字符ASCII码值是偶数则输出该字符。在字符串“good”中,只有“d”的ASCII码值为偶数 13指针与函数 ? C) 3 2 3 4 D) 1 2 3 4 函数指针变量是指向函数的指针变量。 定义的一般形式为: 类型说明符 (*指针变量名)(); 例如: int (*pf)(); 调用函数的一般形式:(*指针变量名)(实参表) 例如:z=(*p)(x,y); ?注: (*指针变量名)中的“()”不能少 }程序运行后的输出结果是( C ) A) 1 3 1 3 B)2 2 3 4 【解析】数组名代表数组首地址,即a[0]的地址。函数调用:fun(a,2) 参数传递后,形参指针x获得数组首地址,即指向a[0],形参变量i=2;*x即为a[0],*(x+2)即a[2],*x=*(x+2)相当于a[0]=a[2],a[0]变为3,a[2]不变。返回到主程序:循环4次,输出a数组前4个元素: 3 2 3 4 例3:(10-09-25)有以下程序 #include char a[]={“good”}; fun(a);printf(“\\n”); {if (*s%2==0) printf(“%c”,*s); s++;} 例1:(09-09-33)设有以下函数: void fun(int n,char *s){…} 则下面对函数指针的定义和赋值均正确的是( A ) A)void (*pf)(); pf=fun; B)void *pf(); pf=fun; C)void *pf(); *pf=fun; D)void (*pf)(int,char);pf=&fun; 【解析】本题考点为指向函数的指针的用法。函数名代表函数的入口地址,可以赋值给指向函数的指针。指向函数的指针应该定义为void (*pf)().如定义为void *pf(),则表示函数pf返回值为一个基类型为 void的指针。 ? ? 函数指针变量不能进行算术运算。 指针型函数是指返回指针值的函数。定义的一般形式为: 类型说明符 *函数名(形参表){…} 例如:int *ap(int x,int y){} r &n 例1:(10-09-11)有以下程序 #include 第 46 页 共 61 页 }注意:字母a的ASCII码值为97,程序运行后的输出结果是( A ) A) d B)go C)god D)good m=1 n=2 p q 聪智学校 { int m=1,n=2,*r=&m; r=f(r,&n) ; printf(”%d\\n”,*r) ; } int *f(int *p,int *q) { return (*p>*q) ?p :q ;} { } if(*c>=?a?&&*c<=?z?) *c=*c-(?a?-?A?); c++; 程序运行后的输出结果是______2_____ } main() { char s[81]; gets(s); fun(s); puts(s): }当执行程序时从键盘上输入Hello Beijing<回车>,则程序的输出结果是( C ) 【解析】本题中f是个指针型函数,返回值为指针值。如示意图。主程序中,指针A)hello beijing B)Hello Beijing C)HELLO BEIJING D)hELLO Beijing r指向m,函数调用f(r,&n)时,实参传递给形参,形参指针p指向m,指针q指向【解析】gets(s)将输入的Hello Beijing赋给了字符数组s,调用fun(s),将字符数组 s的首地址传给了c,c指向的即为字符数组的首地址,通过指针变量c取得字符数 n,*p的值为m的值1,*q的值为n的值2,所以函数返回值为q,返回给主程序 组中的字符判断是不是小写字母,如果是变成大写字母。*c=*c-(?a?-?A?)完成小写 中的指针r,即指针r指向了n,最后输出*r的值为n的值2. 换大写的功能。故选C。另外注意gets(s)和scanf(“%s”,s);的区别:scanf以空格作例2:(11-03-29)有以下程序 为字符串输入结束的标志,而gets(s)不需要 void fun(char *c) { while(*c) 第五课 结构体、链表与共用体 第 47 页 共 61 页 聪智学校 第 48 页 共 61 页 聪智学校 本课重要知识点: 1.知识点:用typedef定义类型 ? 功能:为已有数据类型取别名 ? 类型定义形式: typedef 旧类型名 新类型名;(例如:typedef double D ; ) 注意: (1) 定义的新名只是原名的一个别名,并不是建立一个新的数据类型; (2) 用新名和原名定义的对象具有相同的性质和效果。 例1:(2010-09-39)若有以下语句 typedef struct S {int g; char h;}T; 以下叙述中正确的是 ( B ) A)可用S定义结构体变量 B)可用T定义结构体变量 C)S是struct类型的变量 D)T是struct S类型的变量 【解析】此题中用typedef 说明的新类型名T,与中间部分的结构体类型具有相同的性质和效果 3. 知识点:结构体变量的定义 具体形式 实例 说明 第 49 页 形 struct 结构体名 struct student 特点:先定义类式 { { char num[20]; 型,后定义变量 1 类型标识符 成员名; char name[20]; 注意:定义变量类型标识符 成员名; char sex; 时,必须以 ……………. float score[4]; struct student }; }; 开头,缺一不可 struct 结构体名 变量名表列; struct student stu1,stu2; 形 struct 结构体名 struct student 特点:定义类型式 { { char num[20]; 的同时定义变2 类型标识符 成员名; char name[20]; 量 类型标识符 成员名; char sex; 注意:之后再定 ……………. float score[4]; 义同类型变量}变量名表列; } stu1,stu2; 时,也必须必须以struct student 开头 形struct struct 特点:定义类型式{ { char num[20]; 的同时定义变3 类型标识符 成员名; char name[20]; 量 类型标识符 成员名; char sex; 注意:此形式省 ……………. float score[4]; 略了结构体名,}变量名表列; } stu1,stu2; 预示着后续程序中将不再定义该类型变量 共 61 页 聪智学校 形式4 typedef struct 结构体名 { 类型标识符 成员名; 类型标识符 成员名; ……………. } STU; STU 变量名表列; typedef struct student { char num[20]; char name[20]; char sex; float score[4]; } STU; STU stu1,stu2; 特点:先定义类型,后定义变量 注意:用STU或struct student定义变量具有同等效果,用STU形式简洁方便 struct student *p,stu1; p=&stu1; 成员类型 普通变量 成员 例如:引用成员变量num 操作方式 直接赋值:stu1.num=201101; 间接赋值:p->num=201101 输入:scanf(“%d”,& stu1.num); 输出:printf(“%d”,stu1.num); 数组 例如:引用成员数组元素score[0] 赋值:stu1.score[0]=75; 间接赋值:p-> score[0]=75; 输入:scanf(“%f”,& stu1. score[0]); 输出:printf(“%f”,stu1. score[0]); 字符串 例如:字符数组成员作为字符串name 赋值:strcpy(stu1.name,”zhangsan”); %s作为格式控printf的输入和输出项均为地址 说明 例1:(:2009-09-36)下面结构体的定义语句中,错误的是 ( B ) A)struct ord {int x;int y;int z;}; struct ord a; B)struct ord {int x;int y;int z;} struct ord a; C)struct ord {int x;int y;int z;} n; D)struct {int x;int y;int z;} a; 【解析】遵循先定义类型,再定义该类型变量的原则,类型定义末尾的分号“;”必不可少 间接赋值:strcpy(p->.name,”zhangsan”); 制时,scanf和输入:scanf(“%s”, stu1.name); 输出:printf(“%s”,stu1.name); 2.知识点: 结构体变量各成员的引用 结构体嵌例如:引用内? 引用结构体变量的成员的方法是:结构体变量名.成员名 (例如:stu1.sex) 套 嵌结构体变间接赋值:p-> birth.year=1989; ? 结构体指针变量引用成员的方法是: 量birth的成输入:scanf(“%d”,& stu1. birth.year) 形式1:(*指针变量名).成员名 (例如:(*p).num) 员year 输出:printf(“%d”,stu1. birth.year) 形式2: 指针变量名->成员名 (例如:p->num) 例1:(2009-9-12)设有定义 ? 运算符级别,注意:()和->和 . 同级别,均大于* struct person 设有: { int ID;char name[12];} p; struct student 请将scanf(\语句补充完整,使其能够为结构体变量p的成员ID正确{ char num; 读入数据。 char name[20]; struct date {int year,mon,day} birth; float score[4]; }; 赋值:stu1.birth.year=1989; 【解析】此题答案是 &p.ID ,即在成员ID前缀 p. 表示其从属于变量p,操作方式与普通变量和数组没什么不同,只需要在引用时前面标明属于哪个结构体变量。 第 50 页 共 61 页