C语言程序设计(实验七)
姓名:邹琼
实验地点:学校
实验时间:2020年6月2日
实验项目:
(1)8.3.1 指针基础及指针运算
(2)8.3.2 数据交换
(3)8.3.3 字符串反转及字符串连接
(4)8.3.4 数组元素奇偶排列
一、实验目的
(1)8.3.1 指针基础及指针运算
①加强对指针数据类型的理解;
②熟悉指针的定义、通过指针间接访问变量的方法;
(2)8.3.2 数据交换
①加强对指针类型作为函数参数传递的理解;
②通常将实参传递给形参时,有两种方式,即按值传递和按地址传递,其中指针类型参数即按地址传递;
(3)8.3.3 字符串反转及字符串连接
①加强对字符指针及将指针作为函数的返回类型的理解;
②通过指针对字符串进行操作;
(4)8.3.4 数组元素奇偶排列
①加强对使用指针对数组进行操作的理解;
②通常数组的名称即整个数组的起始存储地址;
二、实验内容
(1)8.3.1 指针基础及指针运算
1.实验代码
#include<stdio.h> int main() { int *p,a,c=3; float *q,b; p=&a; q=&b; printf("Please Input the Value of a, b:"); scanf("%d%f",p,q);//使用指针p和q输入a,b的值// getchar(); printf("Result:\n"); printf("%d,%f\n",a,b); printf("%d,%f\n",*p,*q);//通过指针p和q间接输出a,b的值// printf("The Adress of a, b:%p,%p\n",&a,&b); printf("The Adress of a, b:%p,%p\n",p,q);//输出p和q的值并与上行输出结果进行比较// p=&c; printf("c=%d\n",*p); printf("The Adress of c:%x,%x\n",p,&c);//输出p的值及c的地址// return 0; }
2.问题的简单描述
①使用指针变量,调用scanf()函数分别输入a和b的值;
②按十六进制方式输出p、q的值及a、b的地址;
③将p指向c,通过p间接访问c的值并输出;
3.问题分析
①在scanf()函数中,自第二个参数开始,必须使用地址或地址变量;
②使用printf()来输出指针,可以使用%p、%x格式符来输出十六进制的地址;
③p、&c是等价的,都是指向变量c的地址;
4.实验结果
(2)8.3.2 数据交换
1.实验代码
#include<stdio.h> void swap1(int x, int y); void swap2(int *x, int *y); int main() { int a, b; printf("Please Input a=:"); scanf("%d", &a); printf("\nb=:"); scanf("%d", &b); swap1(a, b); printf("\nAfter Call swap1: a=%d b=%d\n", a, b); swap2(&a,&b);//实参传递// printf("\nAfter Call swap2: a=%d b=%d\n", a, b); return 0; } void swap1(int x, int y) { int temp; temp=x; x=y; y=temp; } void swap2(int *x, int *y) { int temp; temp=*x; *x=*y; *y=temp;//交换x,y地址上的值// }
2.问题的简单描述
①定义指针类型函数用于a,b值的交换;
②第二个函数实参的传递;
3.问题分析
①定义swap2(int *x, int *y),形参x、y是整型指针变量;
②在swap2函数内将通过引用地址取值方式,实现对a、b的值的交换;
③当使用指针作为形参时,实参必须是地址,也应是数组名;
4.实验结果
(3)8.3.3 字符串反转及字符串连接
1.实验代码
#include<stdio.h> #include<conio.h> char *reverse(char *str); char *link(char *str1, char *str2); int main() { char str[30],str1[30],*str2; printf("Input Reversing Character String: "); gets(str); str2=reverse(str); printf("\nOutput Reversed Character String: "); puts(str2); printf("Input String1: "); gets(str); printf("\nInput String2: "); gets(str1); str2=link(str,str1); puts(str2); return 0; } char *reverse(char *str) { char *p,*q,temp; p=str,q=str; while(*p!=‘\0‘)//判断是否到达最后一个字符// p++; p--; while(q<p) { temp=*q; *q=*p; *p=temp; q++;p--;//指针做相向移动处理// } return str;//返回结果// } char *link(char *str1,char *str2) { char *p=str1,*q=str2; while(*p!=‘\0‘) p++; while(*q!=‘\0‘) { *p=*q;//q指向的元素赋值给p所指向的元素// p++;q++ ;//指针做相应的移动处理// } *p=‘\0‘;//令结束字符为空字符// return str1; }
2.问题的简单描述
①定义一个函数将字符串反转;
②定义一个函数将两个字符串连接起来;
3.问题分析
①字符串反转,需要使用两个指针,一个指向起始字符,另一个指向结束字符,相向移动指针q++;p--;
,并交换相应位置的字符;
②第二个函数,需要一个指针移动到第一个字符串的结束字符‘\0‘上,然后将该指针指向第二个字符串,并依次做赋值处理;
③使用返回指针的函数时,在函数最后需要使用return语句返回一个指针值;
4.实验结果
(4)8.3.4 数组元素奇偶排列
1.实验代码
#include<stdio.h> #define N 10 void arrsort(int a[], int n); int main() { int a[N], i; for(i=0; i<N; i++) scanf("%d", &a[i]); arrsort(a, N); for(i=0; i<N; i++) printf("%d ", a[i]); } void arrsort(int a[], int n) { int *p, *q, temp; p=a; q=a+n-1; while(p<q) { while(*p%2==1) p++; while(*q%2==0) q--; if (p>q) break; temp=*p; *p=*q; *q=temp; p++; q--; } }
2.问题的简单描述
①定义一个函数,实现数组元素奇数在左,偶数在右的排列;
②奇偶数的条件判断;
③指针的相向移动;
3.问题分析
①定义arrsort()函数,实现奇左偶右;
②需要用到p、q两个指针,p向后移动直到遇到偶数,q向前移动,直到遇到奇数,然后将p、q所指位置的元素进行交换,继续循环;
③一个指向一维数组的指针加1或减1运算将指向数组的下一个元素或前一个元素;
4.实验结果
三、实验小结
知识点小结:
(1)运算符
①&运算符成为“取地址运算符”;
②运算符称为"指针运算符",也称为"间接运算符";
(2)运用指针,p、*q间接输出
a,b的值;
(3)指针类型作为函数参数传递时,当使用指针作为形参,实参必须是地址,也应是数组名;
(4)输入字符串的最后一个字符为\0;
个人心得:
本章实验内容比较少,需要完成的内容做起来也还行。这次的实验也加深了上理论课时的知识点,发现短处也及时弥补了。个人而言,指针这一章相较于前面几章,理解上有点难度,但多看书多体会就还好吧。