实验十六 指针的使用
实验要求:
1、掌握指针的定义;
2、理解指针的含义;
3、掌握指针的基本使用;
4、能进行程序调试,并修改程序。
特别要求:
在实验中遇到困难时,切忌不要动不动就问老师,而是应该先思考。如果确实不能解决困难,先与坐在旁边的同学讨论,而无论这个同学在以前是否认识。如果有同学问你问题,无论你是否能解决这个问题,都应该和他讨论。如果讨论了仍然不能解决问题,就一起问老师。讨论问题的好处在于能够深刻的理解问题,记住问题。
程序设计
1. 通过指针变量的加减运算:
有int a=4,b=7,要求定义指针pa,pb,并分别指向a,b,要求输出*pa,*pb;然后再使pa=pa+1,pb=pb+1,然后再输出*pa,*pb;然后再使pa指向a,执行pb=pa+1,然后输出pa,pb,sizeof(pb-pa)。观察结果,理解指针。
/*p11_1.c*/ #include <stdio.h>
int main() { int a=4,b=7,*pa,*pb; pa=&a;pb=&b; printf("%d %d\n",*pa,*pb); pa=pa+1;pb=pb+1; printf("%d %d\n",*pa,*pb); pa=&a;pb=pa+1; printf("%d %d %d\n",*pa,*pb,sizeof(pb-pa)); return 0; } |
2,指向一维数组
定义int a[5]={1,2,3,4,5},*p。要求p指向数组a,要求使用指针方式(*(p+i)、p[i])输出各元素。
/*p11_2.c*/ #include <stdio.h>
int main() { int a[5]={1,2,3,4,5},*p,i; p=a; for(i=0;i<5;i++) printf("%d ",*(p+i)); printf("\n"); for(i=0;i<5;i++) printf("%d ",p[i]); printf("\n"); return 0; } |
3、输入10个数,按绝对值从小到大排序后输出,要求定义一个函数sort,完成绝对值从小到大排序。函数原型为void sort(int *a,int n),n表示数据个数,a表示数据元素。然后在main函数中调用排序函数sort。
输入样例:
0 -1 -3 7 2 8 9-10 11 5
输出样例
0 -1 2 -3 5 7 8 9-10 11
/*p11_3.c*/ #include <stdio.h> #include <math.h> int main() { void sort(int *a,int n); int i,a[10]; for(i=0;i<10;i++) scanf("%d",&a[i]); sort(a,10); for(i=0;i<10;i++) printf("%d ",a[i]); printf("\n"); return 0; }
void sort(int *a,int n) { int i,j,k,temp; for(i=0;i<9;i++) { k=i; for(j=i+1;j<10;j++) { if(fabs(a[i]) > fabs(a[j])) k=j; } temp=a[k]; a[k]=a[i]; a[i]=temp; } } |
4、有如下定义:
int ival=60021;
int *ip;
double *dp;
下面哪些赋值非法或可能带来错误,并加以讨论。
ival=*ip; ival=ip; *ip=ival; ip=ival; *ip=&ival;
ip=&ival; dp=ip; dp=*ip; *dp=*ip;
/*p11_4.c*/ ival=*ip; 指针ip没有初始化指向的值也是未知的 ival=ip; ip表示指针地址而ival是一个常量的值 *ip=ival; 指针ip没有初始化指向的区域也是未知的 ip=ival; ip表示的是地址ival表示的是地址对应的值 *ip=&ival; *ip表示的是地址对应的值&ival表示的是地址 ip=&ival; 正确 dp=ip; 类型不同不能指向 dp=*ip; 地址不能和地址的值赋值 *dp=*ip; 类型不同 等式不成立 |
5、编程实现求字符串长度的函数,返回串长(不包括串结束符)。
int strlen1(const char * s);然后在main函数中调用。要求不能在strlen1中调用strlen函数实现。
/*p11_5.c*/ #include <stdio.h> #include <string.h> int main() { int strlen1(const char * s); char a[81]; int i; gets(a); i=strlen1(a); printf("%d\n",i); return 0; }
int strlen1(const char * s) { int i=0; while(s[i]!='\0') { i++; } return i; } |
6、编写函数void replace(char *s,char c1,charc2)实现将s所指向的字符串中所有字符c1用c2替换。字符串、字符c1和c2均在主函数中输入,在main函数中将原始字符串和替换后的字符串显示在屏幕上.
输入样例:
Hsajldklasj kkl
a A
输出样例:
HsAjldklAsj kkl
/*p11_6.c*/ #include <stdio.h> #include <string.h> int main() { void replace(char *s,char c1,char c2); char a[81],c1,c2; gets(a); scanf("%c %c",&c1,&c2); replace(a,c1,c2); puts(a); printf("\n"); return 0; }
void replace(char *s,char c1,char c2) { int i; for(i=0;s[i]!='\0';i++) { if(s[i]==c1) s[i]=c2; } } |
总结(本次实验遇到的问题、解决方法,今后要注意的地方)
1. 定义函数时末尾不加;
2. 忘记输入需要&