指针习题课
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
abcdef
写出程序的运行结果: main() {char *p[ ]={"BOOL","OPK","H","SP"}; int i ; for(i=3; i >=0; i--,i--)printf("%c",*p[i]); printf("\n"); }
so
[例1] 输入a和b两个整数,按先大后小的顺序输出a和b。
p
运行结果: Ann Hare Jack Mary
name[0] name[1] name[2] name[3]
Ann Hare Jack mary
例9:编一个程序,输入月份号,输出该月份的英文月名. main() {char *month[13]={"january","february","march","april", "may","june","july","august","september","octobe r","november","decenber"}; int n; printf("input month:"); scanf("%d",&n); printf(“\t%s”,*(month+n-1)); /*可该为printf("\t%s",month[n-1]);*/ }
例11:写一个函数,求一个字符串的长度,在main函数 中输入字符串,并输出其长度。
main(){ int len; char *str[20]; printf("please input a string:\n"); scanf("%s",str); len=length(str); printf("the string has %d characters.",len);} length(char *p) { int n; n=0; while(*p!='\0') { n++; p++; return n; }
下列程序的输出结果是 B #include <stdio.h> main() {int **k,*a,b=100; a=&b; k=&a; printf(“%d\n”,**k);} A) 运行出错 B) 100 C) a的地址 D) b的地址
。
写出程序的运行结果: f(int b[ ],int n) {int i,r; r=1; for(i=0;i<n;i++)r=r*b[i]; return r; } main() {int x,a[ ]={2,3,4,5,6,7,8,9}; x=f(a,3); printf("%d\n”,x); }
例8:指针的指针
main( ) {int i; char *name[]={"Ann","Hare","Jack","Mary"}; char **p; printf("\n Students's names are:\n"); for(i=0;i<4;i++) { p=name+i; printf("%6s\t",*p); } name指针数组 二维字符数组 }
main () p1 a { int *p1, *p2, *p , a, b; 5 p &b &a scanf("%d,%d",&a,&b); p1 = &a; p2 = &b; p2 b if (a < b) 9 &b &a { p = p1; p1 = p2; p2 = p; } printf("a=%d,b=%d\n",a,b); printf("max=%d,min=%d\n", *p1, *p2 ); } 运行:5,9 a=5,b=9; max=9,min=5 该例不交换变量a、b的值,而是交换指针p1、p2的值。
以下conj函数的功能是将两个字符串s和t连接起来。
char *conj(char *s,char *t) { char *p=s; while(*s) B ; while(*t) {*s= A ;s++;t++;} *s=‘\0’; C ; } ① A) s-B) s++ C) s D) *s ② A) *t B) t C) t-D) *t++ ③ A) return s B) return t C) return p D) return p-t
}
例11:编一个学生管理系统,在主函数中输 入和输出,在自定义函数中进行求总成绩等。
#define N 3 main() { int i,a[N],b[N],c[N],zong[N],*p1,*p2,*p3,*z; char *stu[N]; for(i=0;i<N;i++) {printf("请输入学生姓名"); scanf("%s",stu[i]); printf("请输入%s学生的成绩\n",stu[i]); printf("数学 语文 英语\n"); scanf("%d,%d,%d",&a[i],&b[i],&c[i]); printf("*---------------------*\n"); } p1=a;p2=b;p3=c;z=zong; zcj(p1,p2,p3,zong); printf("姓名 数学 语文 英语 总分\n"); for(i=0;i<N;i++) {printf("%s %d %d %d %d\n",stu[i],a[i],b[i],c[i],zong[i]); } printf("*---------------------------------*\n"); }
例7:用函数指针调用函数max() 用函数指针变量调 int max(int x, int y) /*原型*/ 用函数时,只须将 {int z; (*p)代替函数名 if (x>y) z = x; max,并加上实参 else z = y; return z;} main () { int (*p) (int, int); /*定义函数指针p */ int a,b,c; p = max; /*函数max的入口地址赋给函数指针p*/ scanf("%d,%d", &a, &b); c = (*p)(a,b); /*用函数指针p调用函数 */ printf("a=%d,b=%d,max=%d",a,b,c);}
1定义一个指向变量k的指针变量p的语句是2通过指针变量将数值6赋值给k的语句是3定义一个可以指向指针变量p的变量pp的语句是4通过赋值语句将pp指向指针变量p的语句是5通过指向指针的变量pp将k的值增加一倍的语句是0intpk
习题(指针)
• • • • • • • •
int i; 定义整型变量i int *p; p是指向整型数据的指针变量 int a[n]; 定义数组a,元素类型为int,元素个数是n int *p[n]; p是指针数组,包含n个指针,每一个指针可 以指向整型数据 int f(); f是函数,返回值是int int (*p)(); p是函数指针,所指向的函数返回整型数 据 int *p(); p是函数,返回值是指针,该指针指向整型 数据 int **p; p是指针,指向一个指向整型数据的指针
特点:不移动指针
\0
[例5]:用指针处理字串复制. 特点:移动执针 main () { char a[ ] = "I am a boy.",b[20],*p1,*p2; int i; 数组a p2 数组b p1=a;p2=b; p1 I for ( ; *p1 !='\0'; p1++,p2++) *p2 = *p1; a m *p2 = '\0'; printf("string a is: %s\n",a); a printf("string b is:"); b for (i=0; b[i] !='\0'; i++) o printf("%c",b[i]); y printf("\n"); . \0 }
[例4] 将字符串a复制到字符串b。 main () 用数组名计算数组元素的地址 { char a[ ] = "I am a boy."; char b[20]; 数组a 数组b int i; a I b for (i=0; *(a+i) !='\0'; i++) *(b+i) = *(a+i); a *(b+i) = '\0'; m printf("string a is: %s\n",a); a printf("string b is:"); for (i=0; b[i] !='\0'; i++) b printf("%c",b[i]); o printf("\n"); y } .
例10: 编写函数实现,将一个字符串中的字母全部转换为大写。
#include <stdio.h> #include <string.h> char *Upper(char *s); char *Upper(char *s) { char *ps; ps=s; while(*ps) {if(*ps>='a' && *ps<='z') *ps=*ps-32; ps++; } return s; } void main() { char string[81]; printf("enter a string:\n"); gets(string); printf("before convert: string=%s\n",string); printf(" after convert: string=%s\n",Upper(string)); }
[例6] 求a和b中的大者。 用函数名调用函数max() • int max(int x, int y); /*原型*/ • {int z; • if (x>y) z = x; • else z = y; • return z; • }
• main () • {int a,b,c; • scanf("%d,%d", &a, &b); • c = max(a, b); • printf("a=%d,b=%d,max=%d",a,b,c); • } •
strcpy(a,“STRING”); s=a; } main()
{char *p=“abcdef”;
fun(p); printf(“%s”,p); } abcdef
写出程序的运行结果:
fun(char *s) {s=“STRING”; } main() {char *p=“abcdef”; fun(p); printf(“%s”,p); }
1. 指针变量是把内存中另一个数据的
作为其值的变量。
2. 能有定义:int k; 1) 定义一个指向变量k的指针变量p的语句是 int *p=&k; 。 2) 通过指针变量,将数值6赋值给k的语句是 *p=6; 。 3) 定义一个可以指向指针变量p的变量pp的语句是 int **pp; 。 4) 通过赋值语句将pp指向指针变量p的语句是 pp=&p; 。 5) 通过指向指针的变量pp,将k的值增加一倍的语句是 (**pp)*=2; 。
写出程序的运行结果:
#include <stdio.h> fun(char *s) { int i; for(i=0;i<4;i++) *(s+i)='a'; } main() { char *p="1234"; fun(p); printf("%s\n",p); }
写出程序的运行结果: fun(char *s) {char a[10];
把变量a和b的地址传送给形参
例3:通过以下程序输出a数组中的10个元素。 main() { int a[10],*p,i; p=a; for(i=0;i<10;i++) scanf("%d",p++); printf("\n"); for(p=a,i=0;i<10;i++,p++) printf("%d\t",*p); }
[例2] 题目要求同[例10.2],输入a和b两个整数, 按先大后小的顺序输出a和b。
swap( int* p1,int *p2 ) /*交换指针p1、p2所指向的变量的值 */ { int p; p = *p1; *p1 = *p2; *p2 = p; } main () { int a, b; int *pointer_1, *pointer_2; scanf("%d,%d",&a,&b); pointer_1 = &a; pointer_2 = &b; if (a<b) swap(pointer_1, pointer_2) ; printf("\n%d,%d\n",a,b); }
写出程序的运行结果: main() {char *p[ ]={"BOOL","OPK","H","SP"}; int i ; for(i=3; i >=0; i--,i--)printf("%c",*p[i]); printf("\n"); }
so
[例1] 输入a和b两个整数,按先大后小的顺序输出a和b。
p
运行结果: Ann Hare Jack Mary
name[0] name[1] name[2] name[3]
Ann Hare Jack mary
例9:编一个程序,输入月份号,输出该月份的英文月名. main() {char *month[13]={"january","february","march","april", "may","june","july","august","september","octobe r","november","decenber"}; int n; printf("input month:"); scanf("%d",&n); printf(“\t%s”,*(month+n-1)); /*可该为printf("\t%s",month[n-1]);*/ }
例11:写一个函数,求一个字符串的长度,在main函数 中输入字符串,并输出其长度。
main(){ int len; char *str[20]; printf("please input a string:\n"); scanf("%s",str); len=length(str); printf("the string has %d characters.",len);} length(char *p) { int n; n=0; while(*p!='\0') { n++; p++; return n; }
下列程序的输出结果是 B #include <stdio.h> main() {int **k,*a,b=100; a=&b; k=&a; printf(“%d\n”,**k);} A) 运行出错 B) 100 C) a的地址 D) b的地址
。
写出程序的运行结果: f(int b[ ],int n) {int i,r; r=1; for(i=0;i<n;i++)r=r*b[i]; return r; } main() {int x,a[ ]={2,3,4,5,6,7,8,9}; x=f(a,3); printf("%d\n”,x); }
例8:指针的指针
main( ) {int i; char *name[]={"Ann","Hare","Jack","Mary"}; char **p; printf("\n Students's names are:\n"); for(i=0;i<4;i++) { p=name+i; printf("%6s\t",*p); } name指针数组 二维字符数组 }
main () p1 a { int *p1, *p2, *p , a, b; 5 p &b &a scanf("%d,%d",&a,&b); p1 = &a; p2 = &b; p2 b if (a < b) 9 &b &a { p = p1; p1 = p2; p2 = p; } printf("a=%d,b=%d\n",a,b); printf("max=%d,min=%d\n", *p1, *p2 ); } 运行:5,9 a=5,b=9; max=9,min=5 该例不交换变量a、b的值,而是交换指针p1、p2的值。
以下conj函数的功能是将两个字符串s和t连接起来。
char *conj(char *s,char *t) { char *p=s; while(*s) B ; while(*t) {*s= A ;s++;t++;} *s=‘\0’; C ; } ① A) s-B) s++ C) s D) *s ② A) *t B) t C) t-D) *t++ ③ A) return s B) return t C) return p D) return p-t
}
例11:编一个学生管理系统,在主函数中输 入和输出,在自定义函数中进行求总成绩等。
#define N 3 main() { int i,a[N],b[N],c[N],zong[N],*p1,*p2,*p3,*z; char *stu[N]; for(i=0;i<N;i++) {printf("请输入学生姓名"); scanf("%s",stu[i]); printf("请输入%s学生的成绩\n",stu[i]); printf("数学 语文 英语\n"); scanf("%d,%d,%d",&a[i],&b[i],&c[i]); printf("*---------------------*\n"); } p1=a;p2=b;p3=c;z=zong; zcj(p1,p2,p3,zong); printf("姓名 数学 语文 英语 总分\n"); for(i=0;i<N;i++) {printf("%s %d %d %d %d\n",stu[i],a[i],b[i],c[i],zong[i]); } printf("*---------------------------------*\n"); }
例7:用函数指针调用函数max() 用函数指针变量调 int max(int x, int y) /*原型*/ 用函数时,只须将 {int z; (*p)代替函数名 if (x>y) z = x; max,并加上实参 else z = y; return z;} main () { int (*p) (int, int); /*定义函数指针p */ int a,b,c; p = max; /*函数max的入口地址赋给函数指针p*/ scanf("%d,%d", &a, &b); c = (*p)(a,b); /*用函数指针p调用函数 */ printf("a=%d,b=%d,max=%d",a,b,c);}
1定义一个指向变量k的指针变量p的语句是2通过指针变量将数值6赋值给k的语句是3定义一个可以指向指针变量p的变量pp的语句是4通过赋值语句将pp指向指针变量p的语句是5通过指向指针的变量pp将k的值增加一倍的语句是0intpk
习题(指针)
• • • • • • • •
int i; 定义整型变量i int *p; p是指向整型数据的指针变量 int a[n]; 定义数组a,元素类型为int,元素个数是n int *p[n]; p是指针数组,包含n个指针,每一个指针可 以指向整型数据 int f(); f是函数,返回值是int int (*p)(); p是函数指针,所指向的函数返回整型数 据 int *p(); p是函数,返回值是指针,该指针指向整型 数据 int **p; p是指针,指向一个指向整型数据的指针
特点:不移动指针
\0
[例5]:用指针处理字串复制. 特点:移动执针 main () { char a[ ] = "I am a boy.",b[20],*p1,*p2; int i; 数组a p2 数组b p1=a;p2=b; p1 I for ( ; *p1 !='\0'; p1++,p2++) *p2 = *p1; a m *p2 = '\0'; printf("string a is: %s\n",a); a printf("string b is:"); b for (i=0; b[i] !='\0'; i++) o printf("%c",b[i]); y printf("\n"); . \0 }
[例4] 将字符串a复制到字符串b。 main () 用数组名计算数组元素的地址 { char a[ ] = "I am a boy."; char b[20]; 数组a 数组b int i; a I b for (i=0; *(a+i) !='\0'; i++) *(b+i) = *(a+i); a *(b+i) = '\0'; m printf("string a is: %s\n",a); a printf("string b is:"); for (i=0; b[i] !='\0'; i++) b printf("%c",b[i]); o printf("\n"); y } .
例10: 编写函数实现,将一个字符串中的字母全部转换为大写。
#include <stdio.h> #include <string.h> char *Upper(char *s); char *Upper(char *s) { char *ps; ps=s; while(*ps) {if(*ps>='a' && *ps<='z') *ps=*ps-32; ps++; } return s; } void main() { char string[81]; printf("enter a string:\n"); gets(string); printf("before convert: string=%s\n",string); printf(" after convert: string=%s\n",Upper(string)); }
[例6] 求a和b中的大者。 用函数名调用函数max() • int max(int x, int y); /*原型*/ • {int z; • if (x>y) z = x; • else z = y; • return z; • }
• main () • {int a,b,c; • scanf("%d,%d", &a, &b); • c = max(a, b); • printf("a=%d,b=%d,max=%d",a,b,c); • } •
strcpy(a,“STRING”); s=a; } main()
{char *p=“abcdef”;
fun(p); printf(“%s”,p); } abcdef
写出程序的运行结果:
fun(char *s) {s=“STRING”; } main() {char *p=“abcdef”; fun(p); printf(“%s”,p); }
1. 指针变量是把内存中另一个数据的
作为其值的变量。
2. 能有定义:int k; 1) 定义一个指向变量k的指针变量p的语句是 int *p=&k; 。 2) 通过指针变量,将数值6赋值给k的语句是 *p=6; 。 3) 定义一个可以指向指针变量p的变量pp的语句是 int **pp; 。 4) 通过赋值语句将pp指向指针变量p的语句是 pp=&p; 。 5) 通过指向指针的变量pp,将k的值增加一倍的语句是 (**pp)*=2; 。
写出程序的运行结果:
#include <stdio.h> fun(char *s) { int i; for(i=0;i<4;i++) *(s+i)='a'; } main() { char *p="1234"; fun(p); printf("%s\n",p); }
写出程序的运行结果: fun(char *s) {char a[10];
把变量a和b的地址传送给形参
例3:通过以下程序输出a数组中的10个元素。 main() { int a[10],*p,i; p=a; for(i=0;i<10;i++) scanf("%d",p++); printf("\n"); for(p=a,i=0;i<10;i++,p++) printf("%d\t",*p); }
[例2] 题目要求同[例10.2],输入a和b两个整数, 按先大后小的顺序输出a和b。
swap( int* p1,int *p2 ) /*交换指针p1、p2所指向的变量的值 */ { int p; p = *p1; *p1 = *p2; *p2 = p; } main () { int a, b; int *pointer_1, *pointer_2; scanf("%d,%d",&a,&b); pointer_1 = &a; pointer_2 = &b; if (a<b) swap(pointer_1, pointer_2) ; printf("\n%d,%d\n",a,b); }