2017-03-18
1.编写程序,利用例6.9提供的swap(int *pi1,int *pi2)函数,将三个整数按升序进行排列
#include <stdio.h> void swap(int *p1,int *p2,int *p3); int main() { int a,b,c; printf("请输入三个整数\n"); scanf("%d%d%d",&a,&b,&c); swap(&a,&b,&c); printf("%d %d %d\n",a,b,c); return 0; } void swap(int *p1,int *p2,int *p3) { int temp; if(*p1>*p2) { temp=*p1; *p1=*p2; *p2=temp; } if(*p1>*p3) { temp=*p1; *p1=*p3; *p3=temp; } if(*p2>*p3) { temp=*p2; *p2=*p3; *p3=temp; } }
总结:关键是找到给三个数字排列顺序的算法
2.编写函数,将数组b中大于等于x的数顺序复制到数组a中。请分别用数组和指针作为函数参数的方法完成。
(1)数组
#include <stdio.h> void fuzhi(int a[],int x); int main() { int x,a[5]={5,6,7,8,9}; printf("请输入数字x\n"); scanf("%d",&x); fuzhi(a,x); return 0; } void fuzhi(int a[],int x) { int i,ii,b[5]; for(ii=0,i=0;i<5;i++) { if(x<=a[i]) { b[ii]=a[i]; ii++; } } for(i=0;i<ii;i++) { printf("%d ",b[i]); } printf("\n"); }
(2)指针
#include <stdio.h> void fuzhi(int *p1,int *p2,int x); int main() { int x,*p1,*p2,a[5]={5,6,7,8,9},b[5]; p1=a; p2=b; printf("请输入数字x\n"); scanf("%d",&x); fuzhi(p1,p2,x); return 0; } void fuzhi(int *p1,int *p2,int x) { int i,ii; for(ii=0,i=0;i<5;i++) { if(x<=p1[i]) { p2[ii]=p1[i]; ii++; } } for(i=0;i<ii;i++) { printf("%d ",p2[i]); } printf("\n"); }
总结:1.注意输出的时候数字的个数已经改变找到限制输出数字个数的条件
2.要学会灵活运用指针在主函数中让指针指向要赋值的地址
3.编写函数,判断一个整数是否在一个数组(通过指针参数提供)中出现。如果出现,返回第一次出现位置的下标;不出现时返回值为-1。
#include <stdio.h> int chazhao(int *p,int x); int main() { int x,b,*p,a[5]={1,2,3,4,5}; p=a; printf("请输入整数x\n"); scanf("%d",&x); b=chazhao(p,x); printf("下标为%d\n",b); return 0; } int chazhao(int *p,int x) { int i,dex; for(i=0;i<5;i++) { if(x==p[i]) { dex=i; return dex; } } return -1; }
知识点总结:
1.当使用指针作为函数的形参时,是以数据的地址作为实参调用函数,它的作用是讲一个变量的地址传送到函数中
2.在使用指针做参数时,需要注意,与普通变量一样,在传递值时依然是"值传递"的方式,只不过传递的值是地址,因此不能通过改变指针形参的值使指针实参的值改变。
3.使用指针作为参数在函数间传递数据时,要注意在调用函数中,实参必须是变量的地址,而且变量的数据类型要与指针的数据类型基本一致。
4.注意()的优先级比*高
5.函数指针变量不能进行算数运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的
6.函数调用中“(*指针变量)”两边的括号不可少,其中的*不应该理解为求值运算,在此处它只是一种表示符号。