第七章指针 7.Ⅰ简述指针变量基类型对指针操作的限制。(略) 7.2结合本章后面习题实例,总结用指针操作数组的要点。数组名在操作中起什么作 用?(略) 73总结利用函数指针调用函数的步骤,C语言的这种机制给程序设计带来那些好处? (略) 74比较数组名和指针作函数参数有什么不同。(略) 7.5解释下面指针说明的含义 (1)int*p (2)int*p[5] (3)int(*p)5 (4) int*fpO (5) int(*fp)O (6) int*(*fp)O (7) void*fpO Int s*, p是整型指针 (2)int*p[5,p是5个元素的数组,数组元素是整型指针 (3)int(*p)5];p是指针,指向数组,数组有5个整型元素 (4)int*fp(O),fp是函数,函数返回整型指针 (5)int(*印p)O),印p是指针,指向返回类型为整型的函数。 (6)int*(*印p)O)印是指针,指向返回类型为整型指针的函 (7)void*fp(O,印是函数,函数返回通用指针 (8) int * p是指针,指向一个整型指针。 7.6阅读程序,给出运行结果 (1)#include maino inta34}={1,2,3,4567,89,10,112 int i,i, "p=[&alOJloJ for(i=0,i<3,计++) for(=0,j<4;j+) print(%4d”,*p++) printf("in”) 解: 9101112
第七章 指针 7.1 简述指针变量基类型对指针操作的限制。(略) 7.2 结合本章后面习题实例,总结用指针操作数组的要点。数组名在操作中起什么作 用?(略) 7.3 总结利用函数指针调用函数的步骤,C 语言的这种机制给程序设计带来那些好处? (略) 7.4 比较数组名和指针作函数参数有什么不同。(略) 7.5 解释下面指针说明的含义: (1)int *p; (2)int *p[5]; (3)int (*p)[5]; (4)int *fp(); (5)int (*fp)(); (6)int * (*fp)(); (7)void *fp(); (8)int **p; 解:(1)int *p; p 是整型指针。 (2)int *p[5]; p 是 5 个元素的数组,数组元素是整型指针, (3)int (*p)[5]; p 是指针,指向数组,数组有 5 个整型元素。 (4)int *fp(); fp 是函数,函数返回整型指针。 (5)int (*fp)(); fp 是指针,指向返回类型为整型的函数。 (6)int * (*fp)(); fp 是指针,指向返回类型为整型指针的函数。 (7)void *fp(); fp 是函数,函数返回通用指针。 (8)int **p; p 是指针,指向一个整型指针。 7.6 阅读程序,给出运行结果。 (1)#include main() { int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; int i,j,*p=[&a[0][0]; for (i=0; i<3; i++) { for (j=0; j<4; j++) printf(“%4d”,*p++); printf(“\n”); } } 解: 1 2 3 4 5 6 7 8 9 10 11 12
(2)#include maino i int a=10, "p, **pp p=&a, printf(" % d, %d, %d\n, a, p, **pp) (3)#include #definen 10 void input(int *p, int n for (i=0;i<n: i++) scanf(%d", p++) I int i, n, an] printf(Enter Number: " scanf(%d", &n) input(a, n)
(2)#include main() { int a=10,*p,**pp; p=&a; pp=&p; a++; printf(“%d, %d, %d\n”,a,*p,**pp); } 解:11,11,11 (3)#include main() { char *str=”zyxwvutsrqponmlkjihgfedcba”; while (*str++!=’f’); printf(“%s\n”,str); } 解:edcba (4)#include main() { int i,a[7]={1,2,3,4,5,6,7}; for (i=0; i #define N 10 void input(int *p,int n) { int i; for (i=0;i<n;i++) scanf("%d",p++); } main() { int i,n,a[N]; printf("Enter Number:"); scanf("%d",&n); input(a,n); for (i=0;i<n;i++)
printf( "\n") (2)求整形数组的最大值。 解:参考程序如下: int max(int *p, int n) if (*(p+i)>mx)mx=*(p+i) in o inta[8]={23,4,6,12,33,55,2,45} printf("max is %d\n", max(a, 8)) (3)字符串拷贝 解:参考程序如下 #include char s*strcp(char *sl, char *s2) for(p=s1;*s2!=0;s2++,s1+) char s1[80],s2[80] printf(" \n copy string result is: %s \n", s1) 7.8设计一个使用指针的函数,交换数组a和数组b的对应元素
printf("%d ",*(a+i)); printf("\n"); } (2)求整形数组的最大值。 解:参考程序如下: #include int max(int *p,int n) { int i,j,mx; mx=*p; for (i=1;imx) mx=*(p+i); return mx; } main() { int a[8]={23,4,6,12,33,55,2,45}; printf("max is %d\n",max(a,8)); } (3)字符串拷贝。 解:参考程序如下: #include char *strcp(char *s1,char *s2) { char *p; for (p=s1;*s2!='\0';s2++,s1++) *p++=*s2; *p='\0'; return s1; } main() { char s1[80],s2[80]; printf("Enter string:"); gets(s2); strcp(s1,s2); printf("\n copy string result is: %s \n",s1); } 7.8 设计一个使用指针的函数,交换数组 a 和数组 b 的对应元素
解:参考程序如下: include include void change (int *a, int =b, int n) (i=0;i<n;i++) *(a+i)=*(b+i) mainO inti,a[10]={1,2,3,4,5,6,7,8,9,0}; intb[10]={11,12,13,14,15,16,17,18,19,20}; printf(" Change Before: " printf( \aRray a: for(i=0;i<10;i++) printf(%4d ", alil) printf( "\n printf( "array b: for(i=0;i<10;i++) printf(%4d ",bli]) printf( \n " b,10) printf( Change After: " printf( \aRray a for(i=0;i<10;i+) printf( %4d ", alil) printf(" \n " printf( array b: for(i=0;i<10;i++) printf("%4d ",blil printf( \n " 79编写程序,使用指针将字符串str中的所有字符‘k删除。 解:参考程序如下 #include <stdio void delchar (char *kstr, char c)
解:参考程序如下: #include #include void change(int *a,int *b,int n) { int i,t; for (i=0;i void delchar(char *str,char c)
for (p=str: *p!=\0: p++) f(*p!=c I char str[80] 7.10设计函数 Insert(sl,s2,n),用指针实现在字符串s1中的指定位置处n,插入字符串 解:参考程序如下: #include char insert(char *sl, char *s2, int t I for(p=s1,i=0;*p!=\0’&&i<n-1;i++,p+) q=p;/*确定插入位置* if(*p!=103)/米中间插入*/ for(;*p!=\0’;p++);/*原串尾部*/ /*后移*/ *(p+strlen (s2))=k Ise *(p+strlen(s2))=\0 for(;*s2!=10’;s2++)/插入*/ I char sl[80], s2[80] printf( Enter string 1: gets(s1) printf( Enter string 2:
{ char *p; for (p=str;*p!='\0';p++) if (*p!=c) *str++=*p; *str='\0'; } main() { char str[80]; gets(str); delchar(str,'k'); puts(str); } 7.10 设计函数 insert(s1,s2,n), 用指针实现在字符串 s1 中的指定位置处 n,插入字符串 s2。 解:参考程序如下: #include #include char *insert(char *s1,char *s2,int n) { char *p,*q; int i; for (p=s1,i=0;*p!='\0'&&i=q;p--) /*后移*/ *(p+strlen(s2))=*p; } else *(p+strlen(s2))='\0'; for (;*s2!='\0';s2++) /*插入*/ *q++=*s2; return s1; } main() { char s1[80],s2[80]; int n; printf("Enter string 1:"); gets(s1); printf("Enter string 2:");
printf( Enter insert address: " scanf("d",&n): printf("\n insert string result is: %s \n", s1): 7.1用指针方法完成冒泡排序函数 解:参考程序如下: #includestdio. h> define 20 void sort(int *a, int n) for(i=0;i<n-1; i++) if(*(a+j)》*(a+j+1)) (a+j)=*(a+j+1) 米(a+j+1)=t main a[N]; printf(" Enter number: scanf("d",&n): printf( Enter array element: scanf(%d", a+i) printf( After Sorted: \n") for(i=0; i<n; i++) printf(%d" *(ati)) printf(\n") 7.12用指针方法完成选择法排序函数。 解:参考程序如下:
gets(s2); printf("Enter insert address:"); scanf("%d",&n); insert(s1,s2,n); printf("\n insert string result is: %s \n",s1); } 7.11 用指针方法完成冒泡排序函数。 解:参考程序如下: #include #define N 20 void sort(int *a,int n) { int i,j,t; for (i=0;i*(a+j+1)) { t=*(a+j); *(a+j)=*(a+j+1); *(a+j+1)=t; } } main() { int i,n,a[N]; printf("Enter number:"); scanf("%d",&n); printf("Enter array element:"); for (i=0;i<n;i++) scanf("%d",a+i); sort(a,n); printf("After Sorted: \n"); for (i=0;i<n;i++) printf("%d ",*(a+i)); printf("\n"); } 7.12 用指针方法完成选择法排序函数。 解:参考程序如下:
#include define 20 void sort(int *x, int n) I int i, j,k, t: for(i=0;i<n-1;i++) [k=i for (j=i+l; j<n: j++) if(*(x+j)<*(x+k)) t=*(x+ *(x+i)=*(x+k) *(x+k)=t; i,a[N]={23,12,33,56,17,8,25} sort(a, 7) printf( After Sorted: \n") for(i=0;i<7;i++) printf(%d"*p++) printf(" \n 7.13用指针操作实现将整形数组元素循环右移m位的程序 解:关键是移动位置的计算,下标i的前一元素位置应为:(N+i-m)%N,其中,N是循 环右移的元素个数, count是移动元素的个数。如果N是m的倍数,外循环只有一次。参 考程序如下: #include<stdio. h #definen 20 void move (int *x, int n, int m) I int i, j,k for (j=0; j<m: j++) i k=lIl: t=j i=(n+t-m)%n while (il=j)
#include #define N 20 void sort(int *x,int n) { int i,j,k,t; for (i=0;i #define N 20 void move(int *x,int n,int m) { int i,j,k,t,count=0; for (j=0;j<m;j++) { k=x[j]; t=j; i=(n+t-m)%n; while (i!=j)
f(count=n)return x[t]=k: count++ if (count==n)return inti,a[N={1,2,3,4,5,6,7,8,9,10,11,12}; printf(" Enter m: " scanf("d", &m) move(a, 12, m) printf (" After moved: \n) for(i=0;i=1) printf("It is %. *(weekname+n)) printf("It is wrong. " 7.15编写程序,输入数组大小后,通过动态分配内存函数 malloc产生数组
{ x[t]=x[i]; count++; if (count==n) return; t=i; i=(n+t-m)%n; } x[t]=k; count++; if (count==n) return; } } main() { int i,a[N]={1,2,3,4,5,6,7,8,9,10,11,12}; int m,*p=a; printf("Enter m:"); scanf("%d",&m); move(a,12,m); printf("After moved: \n"); for (i=0;i main() { char *weekname[7]={"Sunday","Monday","Tuesday","Wednesday", "Thursday","Friday","Saturday"}; int n; printf("Enter week:"); scanf("%d",&n); if ((n=1)) printf("It is %s.",*(weekname+n)); else printf("It is wrong."); } 7.15 编写程序,输入数组大小后,通过动态分配内存函数 malloc 产生数组
解:设数组元素类型为整型。参考程序如下: include #include p=(int *)malloc(n*sizeof (int)) return p, main printf( Enter n: " i for (i=0; i<n; i++) printf( \n") 第八章结构及其他 81C语言的结构类型在构造复杂数据类型方面与数组有何不同?(略) 82C语言的结构和联合有何区别?(略) 83完成下面判断 (1)说明一个结构变量时,系统分配给它的内存是各成员所需内存量的总合。(错) (2)说明一个结构变量时,系统分配给它的内存是成员中占内存量最大者所需的内 存容量。(错) (3)说明一个联合变量时,系统分配给它的内存是各成员所需内存量的总合。(错) (4)说明一个联合变量时,系统分配给它的内存是成员中占内存量最大者所需的内 存容量。(对) (5)结构变量可以整体赋值。(对) (6)结构变量名可以作函数形参。(对) (7)一个联合变量中不能同时存放其所有成员。(对) (8)联合类型数据可以出现在结构类型定义中,结构类型数据也可以出现在联合类 型定义中。(对) (9) enum color (red, blue, yellow, green) a, b; (Xf)
解:设数组元素类型为整型。参考程序如下: #include #include int *array(int n) { int *p; p=(int *)malloc(n*sizeof(int)); return p; } main() { int i,n,*p; printf("Enter n:"); scanf("%d",&n); p=array(n); if (p) { for (i=0;i<n;i++) *(p+i)=i; for (i=0;i<n;i++) printf("%d, ",*(p+i)); printf("\n"); } } 第八章 结构及其他 8.1 C 语言的结构类型在构造复杂数据类型方面与数组有何不同?(略) 8.2 C 语言的结构和联合有何区别?(略) 8.3 完成下面判断: (1)说明一个结构变量时,系统分配给它的内存是各成员所需内存量的总合。(错) (2)说明一个结构变量时,系统分配给它的内存是成员中占内存量最大者所需的内 存容量。(错) (3)说明一个联合变量时,系统分配给它的内存是各成员所需内存量的总合。(错) (4)说明一个联合变量时,系统分配给它的内存是成员中占内存量最大者所需的内 存容量。(对) (5)结构变量可以整体赋值。(对) (6)结构变量名可以作函数形参。(对) (7)一个联合变量中不能同时存放其所有成员。(对) (8)联合类型数据可以出现在结构类型定义中,结构类型数据也可以出现在联合类 型定义中。(对) (9)enum color {red,blue,yellow,green} a,b; (对)
(10) enum color{"red”,"blue, yellow,"gren'”}ab,(错) (11) typedef double real;的作用是定义了一个新的数据类型。(错) (12) typedef double real;的作用是定义了一个新的数据类型表示符real。(对) 84计算下面表达式 (1)intb=2;计算bnum); printf("%10s", p->name) printf("%4d\n,, p->age) f struct stu student[3]=( 19901, "LiHong", 19) 19903, Zhang Yang", 19)) info(student) pinfo(student+2) 解:901 LiHong 9903 Zhang Yang 19 (2)#include<stdio. h union
(10)enum color {“red”, “blue”, “yellow”, “green”} a,b; (错) (11)typedef double real; 的作用是定义了一个新的数据类型。(错) (12)typedef double real; 的作用是定义了一个新的数据类型表示符 real。(对) 8.4 计算下面表达式。 (1)int b=2; 计算 b struct stu { int num; char name[10]; int age; }; void pinfo(struct stu *p) { printf(“%5d “,p->num); printf(“%10s”,p->name); printf(“%4d\n”,p->age); } main() { struct stu student[3]={ {9901, "LiHong",19}, {9902, "Wangtao",18}, {9903, "ZhangYang",19} }; pinfo(student); pinfo(student+2); } 解:9901 LiHong 19 9903 ZhangYang 19 (2) #include main() { union