1、C语言实验六+指针实验六 指针一、实验目的1、掌握指针的概念,定义和使用指针变量;2、掌握指针与数组的关系,指针与数组有关的算术运算、比较运算。3、掌握字符串指针作的用法。二、相关知识点地址和指针的概念;数组和指针的关系;字符串和指针的关系;三、实验内容一(验证及程序分析)Eg5-1: 输入两个整数,并使其从大到小输出,用指针变量实现数的比较。(1)源程序: #include void main() int *p1,*p2,*p,a,b; scanf(%d,%d,&a,&b); p1=&a; p2=&b; if(ab) p=p1; p1=p2; p2=p; printf(a=%d,b=%dn,
2、a,b); printf(max=%d,min=%dn,*p1,*p2);(2)程序运行结果:运行结果抓图至下方:(3)在程序中的定义一个整型变量t,然后将语句段 if(ab) p=p1; p1=p2; p2=p; 改为: if(ab) t=*p1; *p1=*p2; *p2=t; 再运行结果,观察两程序的区别。运行结果抓图至下方:区别:a和b输出的值与输入的数字换了 Eg5-2:运行并改正下面程序中的错误。#include void main() int a=3,b; int *p; *p=a; b=*p; printf(%dn,b); a=100; b=*p; printf(%dn,b);
3、(1)程序运行结果:运行结果抓图至下方:(2)请简要分析程序错误的原因:程序错误的原因:不能对指针进行赋值,只能对p赋值地址(3)请将程序中的错误改正后重新运行:程序中错误语句:*p=a;改正为:p=&a;程序运行的结果:Eg5-3:用指针法输入 12 个数,然后按每行 4 个数输出。(1)算法分析:定义一个整型数组和一个整型指针,这样通过数组就可以静态分配内存空间,存储数据;然后将指针与数组相关,使指针指向与数组相同的首地址处,这样就可以通过指针对数组的存储空间加以操作。(2)源程序:#include void main() int j,k,a12,*p ; p=a; /使指针 p 指向与数
4、组 a的首地址处 for(j=0;j12;j+) scanf(%d,p+); /移动 P 的位置,输入数据 p=a; /指针重新定位到数组a的首地址 for(j=0;j12;j+) if( ) printf(n); /按每行 4 个数输出 printf(%4d,*p+); /注意:*p+相当于*(p+) printf(n); (2)程序运行结果:运行结果抓图至下方:Eg5-4:用字符串指针实现两个字符串的复制。(1)算法分析:分别定义两个字符数组,用于存放字符串;再定义两个字符串指针,分别指向两个串的起始地址,进行串复制,其实就是将一个指针(如p1)所指向的字符,复制给另一个指针(如p2)所指
5、向的位置,重复该过程直到串尾。如下图:(2)源程序:#includevoid main() char a30=C program.; char b30,*p1,*p2; p1=a; p2=b; /两个指针分别指向两个字符串的起始位置 for( ;*p1!=0;p1+,p2+) /当串1没有到串尾时,进行复制 ; * p2=0; /给串2加上结束标志 printf(string a is:%sn,a); printf(string b is:%sn,b);(3)程序的运行结果:运行结果抓图至下方:Eg5-5: 用字符串指针实现字符串的接收。(1)源程序#includevoid main() ch
6、ar * str; scanf(%s,str); printf(输入的字符串是:%sn,str);(2)请简要分析程序错误的原因:程序运行错误的原因:str只是一个指针,没有具体地址,不能存储数据 (3)请将程序中的错误改正后重新运行:改正后的程序:#includevoid main() int *str,a40; str=a; scanf(%s,str); printf(输入的字符串是:%sn,str);程序运行的结果:Eg5-6:用字符指针数组处理多个字符串:用选择排序法将若干字符串按字母顺序排序输出。(1)算法分析: 定义一个字符指针数组,给定其初值为若干字符串,则数组中的各指针分别指向
7、字符串。用strcmp函数比较各字符串的大小,并按选择法进行排序后,则str指针数组中的指针所指向的字符变为有序。注意:在进行字符比较时,一定要用strcmp函数;比较过程中,当需要交换两字符位置时,并不是直接交换两串的内容,而是交换指针变量中的值。当指针的指向变了,则输出时的内容也随之改变。如下图:(2)源程序:#include#includevoid main( ) char * str=C program, Basic, Foxbase+, Fortran, Pascal; int i,j; char * temp; for(i=0;i4;i+) /*选择法排序*/ for(j=i+1;
8、j0) /当前面串比后面的大时,交换位置 temp=stri; stri=strj; strj=temp; for(i=0;i5;i+) printf(%sn,stri);(3)运行程序,并将程序的运行结果抓图至下方:运行结果抓图至下方:四、实验内容二(综合及设计类)Eg5-7: 练习指针与字符串:在一行字符串中删去指定的字符。例如,要求在一行文字:“I have 150 Yuan!”中删去字符“0”,使其变为“I have 15 Yuan!”。字符串可用gets()函数接收,要删除的字符用getchar( )函数接收。(1)算法提示:先用一个字符串指针指向串的开头,然后用循环进行比较,当*p
9、与接收到的字符不同时,指针后移,继续比较。比较到相同时,把指针后面的字符复制给指针当前所指向的位置,如 *p=*(p+1);(2)请将源程序及结果粘贴到下面。#include#includevoid main( ) char *str,*p,a100,b100,*t; str=a;p=b; printf(请输入你的字符串:); gets(str); printf(请输入你要减去的字符:); gets(p); for(;*str!=0;str+) for(p=b;*p!=0;p+) if(*str=*p) t=str; for(;*t!=0;t+) *t=*(t+1); *t=0; str=a;
10、 printf(最后的字符串是:); printf(%sn,str);运行结果抓图至下方:五、体会函数与指针 :Eg5-9:函数参数传值的单向值传递示例:#includeswap(int m ,int n) int z; z=m;m=n;n=z; printf(形参:m=%d,n=%d,m,n);void main() int m=3,n=5; swap(m,n); printf(实参:m=%d,n=%d,m,n);(1)程序运行结果:运行结果抓图至下方:(2)请简要说明程序中的swap函数为何没有实现主函数中实参值的互换:原因:因为swap中的m,n是有生命期限的而且没有返回给主函数,所以在
11、主函数中m,n还是没有换位置。Eg5-10:地址作为函数的参数示例。#include void swap(int * p1,int * p2) int t; t=*p1;*p1=*p2;*p2=t; void main() int a,b,*p1,*p2; scanf(%d,%d,&a,&b); p1=&a; p2=&b; swap(p1,p2); printf(a=%d,b=%dn,a,b); printf(*p1=%d,*p2=%d,*p1,*p2); (1)程序运行结果:运行结果抓图至下方:(2)请将本程序与上一程序比较,并分析在本程序中,swap函数是否改变了函数单向值传递的特性?回答
12、:这个函数改变了p1,p2所指向地址的值(3)若将swap函数改为:void swap(int * p1,int * p2) int * t; t=p1;p1=p2;p2=t; 是否仍能实现两数互换?为什么?程序运行的结果:是否仍能实现两数互换?为什么?不能,因为p1,p2 装的是地址,即使在swap函数中换了位置,在主函数中也没有换位置,这和Eg5-9的问题一样。(4)若将swap函数改为:void swap(int * p1,int * p2) int * t; *t=*p1;*p1=*p2;*p2=*t; 是否仍能实现两数互换?为什么?程序运行的结果:是否仍能实现两数互换?为什么?不能,因为t没有指向一个地址,不能储存数据
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1