C语言程序设计报告七
姓 名:赖瑾
实验地点:宿舍
实验时间:2020年6月2日
实验项目:
一、实验目的与要求
8.3.1. 指针基础及指针运算
本实验旨在加强学生对指针数据类型的理解,熟悉指针的定义、通过指针简介访问变量。
8.3.2. 数据交换
本实验旨在加强学生对指针类型作为函数参数传递的理解,通常将实参传递给形参时,有两种方式,即按值传递和按地址传递,其中指针类型参数即是按地址传递。
8.3.3. 字符串反转及字符串连接
本实验旨在加强学生对字符指针以及将指针作为函数的返回类型的理解,并通过指针对字符串进行操作,通常来说,一个字符在内存中式连续存放的,其开始地址为指向该字符串的指针值,字符串均以‘\0‘作为结束字符。
8.3.4. 数组元素奇偶排列
本实验旨在加强学生对使用指针对数组进行操作的理解,通常数组的名称即整个数组的起始存储地址,可以定义一个指针指向它,然后通过指针移动来访问各个数组成员。
二、实验内容
(1)8.3.1 指针基础及指针运算 |
1、问题的简单描述:①定义一个整型指针变量p,使它指向一个整型变量a,定义一个浮点型指针q,使它指向一个浮点型变量b,同时定义另外一个整型变量c并赋值初值3 。②使用指针变量,调用scanf函数分别输入a和b的值。③通过指针间接访问并输出a、b的值。④按16进制方式输出p、q的值以及a、b的地址。⑤将p指向c,通过p间接访问c的值并输出。⑥输出p的值以及c的地址,并与上面的结果进行比较。
2、实验代码:
#include<stdio.h> 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); printf("Result:\n"); printf(" %d, %f\n",a,b); printf(" %d, %f\n",*p,*q); printf("The Address of a,b: %p, %p\n",&a,&b); printf("The Address of a,b: %p, %p\n",p,q); p=&c; printf("c=%d\n",*p); printf("The Address of c:%x, %x\n",p,&c); return 0; }
3、问题分析:这题老师讲过也比较简单所以没什么问题,关键在于对指针的理解,之前对指针有一个错误的理解就是把int *p=&a理解成了int *p
和*p=&a
实际上是int *p
和p=&a
。
4、最终运行效果:
(2)8.3.2 数据交换 |
1、问题的简单描述:①定义两个函数,分别为void swap1(int a,int b)和void swap2(inta,intb),用于交换a、b的值。②从主函数中分别输入两个整型变量a、b。③从主函数中分别调用上述两个交换函数,并打印输出交换后的a、b的结果。
2、实验代码:
#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(" b=:"); scanf("%d",&b); swap1(a,b); printf("\nAfter Call swap1: a=%d b=%d\n",a,b); int *p=&a,*q=&b; swap2(p,q); 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; }
3、问题:这题我的问题出在把temp前面也加了*
。
4、分析:这样temp就是一个指针了不能进行值的交换,而这里只是需要一个中间值而已,不需要指针。
5、最终运行效果:
(3)8.3.3 字符串反转及字符串连接 |
1、问题的简单描述:①定义两个字符指针,通过get()函数输入两个字符串。②定义一个函数charreverse(charstr),通过指针移动的方式将字符串反转。③定义一个函数charlink(charstr1,char*str2),通过指针移动方式将两个字符串连接起来。④从主函数中分别调用上述函数,输入字符串并打印输出结果。
2、实验代码:
#include<stdio.h> char *reverse(char *str); char *link(char *str1,char *str2); int main() { char str[30], str1[30], *str2; printf("Intput Reversing Character String: "); gets(str); str2=reverse(str); printf("\nOutput Reversing Character String: "); puts(str2); printf("Input String1: "); gets(str); printf("Input 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; p++; q++; } str2=NULL; return str1; }
3、问题分析:这题关键在于如何理解题目意思,这里需要定义两个指针,一个指向第一个字符一个指向最后一个字符,通过指针让它们两端的字符进行对换,从而达到交换的目的。这里还需要注意的是p++
是往后移动,p--
是往前移动因为位置数字是小的数字在前面大的在后面,跟平时习惯不太一样,容易搞错。还有while这个地方没有花括号就循环体就是下一步,然后这里循环结束并不是指向最后一个字符而是/0
所以还要向前移动一位。
4、最终运行效果:
(4)8.3.4 数组元素奇偶排列 |
1、问题的简单描述:①定义一个整型一维数组,任意输入数组的元素其中包含奇数和偶数。②定义一个函数,实现将数组元素奇数在左、偶数在右的排列。③在上述定义的函数中,不允许再增加新的数组。③从主函数中分别调用上述函数,打印输出结果。
2、实验代码:
#include<stdio.h> #define N 10 void arrsort(int a[],int n); 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!=0) p++; while(*q%2==0) q--; if(p>q) break; temp=*p; *p=*q; *q=temp; p++; q--; } }
3、问题分析:这题没有很难,老师上课也讲的很清楚,就是两个指针一个向后移动直到遇到偶数,一个从末尾向前移动直到遇到奇数,然后将两个指针指向的元素值交换,继续循环。
4、最终运行效果:
四、实验小结
总体上指针我还是觉得蛮难理解的,感觉很容易搞混,一维数组二维数组很多定义也不一样,我理解了很久的点还有当形参作为整型变量被调用时,实参的值传递给它们,实参变量和形参变量定义是在不同的函数中的局部变量,存储的地址不同,所以在函数内交换形参的值对实参的值是不会有影响的。但是当形参是作为整型指针变量,而被调用时,实参的地址值将被传递给形参,这个时候实参和形参具有相同的内存存储地址,从而可以实现实参的值的交换 。这一点之所以我不理解很大一部分原因是之前学习存储地址的时候没搞懂,对于什么静态存储都不太理解,倒回去弄清楚了这些感觉就好理解多了。然后这些实验也具体的操作了一下,了解指针可以怎么用,老师说这些都不太难,但是对我来说还挺难的,代码可能比较快就写出来了,但是很多地方都不理解为什么要这样写,为什么那样写不行,自己去查了一下,也理解多了。