第七章指针 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<stdio. h> 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<stdio.h> 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<stdio.h> maino i int a=10, "p, **pp p=&a, printf(" % d, %d, %d\n, a, p, **pp) (3)#include<stdio. h i char *str='zyxwvutsrqponmlkjihgfedcba while(str++!=f); edcb inti,a[7={1,2,3,4,56,7} printf("%4d“,*(a+i)) 7.7利用指针完成下列函数 (1)从键盘读入数组元素。 解:设整型数组,参考程序如下 #include <stdio. h> #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<stdio.h> main() { int a=10,*p,**pp; p=&a; pp=&p; a++; printf(“%d, %d, %d\n”,a,*p,**pp); } 解:11,11,11 (3)#include<stdio.h> main() { char *str=”zyxwvutsrqponmlkjihgfedcba”; while (*str++!=’f’); printf(“%s\n”,str); } 解:edcba (4)#include<stdio.h> main() { int i,a[7]={1,2,3,4,5,6,7}; for (i=0; i<7; i+=2) printf(“%4d “,*(a+i)); } 解:1,3,5,7 7.7 利用指针完成下列函数: (1)从键盘读入数组元素。 解:设整型数组,参考程序如下: #include <stdio.h> #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 <stdio. h> 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 <stdio.h> int max(int *p,int n) { int i,j,mx; mx=*p; for (i=1;i<n;i++) if (*(p+i)>mx) 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 <stdio.h> 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 <stdio. h> include <string. h> 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 <stdio.h> #include <string.h> void change(int *a,int *b,int n) { int i,t; for (i=0;i<n;i++) { t=*(a+i); *(a+i)=*(b+i); *(b+i)=t; } } main() { int i,a[10]={1,2,3,4,5,6,7,8,9,0}; int b[10]={11,12,13,14,15,16,17,18,19,20}; printf("Change Before:"); printf("\nArray a:"); for (i=0;i<10;i++) printf("%4d ",a[i]); printf("\n "); printf("\nArray b:"); for (i=0;i<10;i++) printf("%4d ",b[i]); printf("\n "); change(a,b,10); printf("Change After: "); printf("\nArray a:"); for (i=0;i<10;i++) printf("%4d ",a[i]); printf("\n "); printf("\nArray b:"); for (i=0;i<10;i++) printf("%4d ",b[i]); printf("\n "); } 7.9 编写程序,使用指针将字符串 str 中的所有字符‘k’删除。 解:参考程序如下: #include <stdio.h> 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 <string. h> 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 <stdio.h> #include <string.h> char *insert(char *s1,char *s2,int n) { char *p,*q; int i; for (p=s1,i=0;*p!='\0'&&i<n-1;i++,p++); q=p; /*确定插入位置 */ if (*p!='\0') /*中间插入*/ { for (;*p!='\0';p++); /*原串尾部*/ for (;p>=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:");