第八章 指针实验

C程序设计实验报告

实验项目:

###8.3.1 指针基础及指针运算 ###8.3.2 数据交换 ###8.3.3 字符串反转及字符串连接 ###8.3.4 数组元素奇偶排列 ##姓名:罗龙妹 实验地点: 514实验室 实验时间:2019年6月12日 ##一、实验目的与要求 ###8.3.1 指针基础及指针运算 - 加强学生对指针数据类型的理解,熟悉指针的定义、通过指针间接访问变量 ###8.3.2 数据交换 - 加强学生对指针类型作为函数参数传递的理解 ###8.3.3 字符串反转及字符串连接 - 加强学生对字符指针以及将指针作为函数的返回类型的理解,并通过指针对字符串进行操作。 ###8.3.4 数组元素奇偶排列 - 加强学生对使用指针对数组进行操作的理解。 ##二、实验内容 ##8.3.1 :指针基础及指针运算 - 问题的简单描述: (1)定义一个整型指针变量p,使它指向一个整型变量a,定义一个浮点型指针q,使它指向一个浮点型变量b,同时定义另外一个整型变量c并赋初值3。 (2)使用指针变量,调用scanf函数分别输入a和b的值。 (3)通过指针间接访问并输出a、b的值。 (4)按十六进制方式输出p、q的值以及a、b的地址。 (5)将p指向c,通过p间接访问c的值并输出。 (6)输出p的值及c的地址,并与上面的结果进行比较。 - 实验代码1: ``` #include 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的值*/ printf("Result:\n"); printf(" %d,%f\n",a,b); printf(" %d,%f\n",*p,*q); /*通过指针p和q间接输入a,b的值*/ printf("The Address of a,b:%p,%p\n",&a,&b); printf("The Address of a,b:%p,%p\n",p,q); /*输出p和q的值并与上行输出结果进行比较*/ p=&c; printf("c=%d\n",*p); printf("The Address of c:%x,%x\n",p,&c); /*输出p的值以及c的地址*/ return 0; } ``` - 问题分析:(重点分析在实验过程中出现的问题,及解决方法。) 这道题在上课的时候讲过了,所以很快就运行成功了,在scanf函数中,从第二个参数开始,必须使用地址或地址变量;指针p和q都是变量,因此可以指向不同的地址,但必须是同类型的。 - 程序运行如下: ![](https://img2018.cnblogs.com/blog/1617039/201906/1617039-20190613105336801-1498200852.png) ##8.3.2 :数据交换 - 问题的简单描述: (1)定义两个函数,分别为void swap1(int a,int b)和swap2(int*a.int*b),用于交换a,b的值。 (2)从主函数中分别输入两个整型变量a、b。 (3)从主函数中分别调用上述两个交换函数,并打印输出交换后a、b的结果。 - 实验代码: ``` #include 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("\n b=:"); 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; /*交换x,y地址上的值*/ temp=*x; *x=*y; *y=temp; } ``` 3问题分析:(重点分析在实验过程中出现的问题,及解决方法。) 这道题上课也讲过了,需要注意指针和变量的区别,还要注意实参和形参是定义在不同函数中的局部变量时,其存储地址不同,所以在函数swap1内交换x、y的值对主函数中a、b的值不会产生影响;还有,当使用指针作为形参时,实参必须是地址,也可以是数组名。 - 程序运行如下: ![](https://img2018.cnblogs.com/blog/1617039/201906/1617039-20190613120628041-579942650.png) ##8.3.3:字符串反转及字符串连接 - 问题的简单描述: (1)定义两个字符指针,通过gets()函数输入两个字符串。 (2)定义一个函数char*reverse(char*str),通过指针移动方式将字符串反转。 (3)定义一个函数char*link(char*str1,char*str2),通过指针移动方式将两个字符串连接起来。 (4)从主函数中分别调用上述函数,输入字符串并打印输出结果。 - 实验代码: ``` #include 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("Output Reversed Character String:"); puts(str2); printf("Input String1:"); gets(str); printf("Input String2:"); gets(str1); str2=link(str,str1); printf("Link String1 and String2:"); 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;
}

- 问题分析:(重点分析在实验过程中出现的问题,及解决方法。)
这个程序需要达到两个效果,一是实现字符的反转,这需要通过两个指针移动的方式将字符串反转,一个指向起始字符,另一个指向结束字符,相向移动指针,并交换相应位置的字符,我在编写字符串反转的代码时,不知道指针做相向移动处理怎么写,导致程序一直运行不成功,后来是通过询问同学才将程序运行成功的;二是实现字符串的连接,这个也要通过指针移动的方式将两个字符串连接起来,需要一个指针移动到第一个字符串的结束字符‘\0’上,然后将该指针指向第二个字符串,并依次做赋值处理。
- 程序运行结果如下:</font>
![](https://img2018.cnblogs.com/blog/1617039/201906/1617039-20190613120821364-723880661.png)
<font color="black" size = "3px">
##8.3.4:数组元素奇偶排列
- 问题的简单描述:
(1)定义一个整型一维数组,任意输入数组的元素,其中包含奇数和偶数。
(2)定义一个函数,实现将数组元素奇数在左,偶数在右的排列。
(3)在上述定义的函数中,不允许再增加新的数组。
(4)从主函数中分别调用上述函数,打印输出结果。
- 实验代码:

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!=0)/判断p是否为奇数/
p++;/指针向后移动/
while(q%2==0)/判断p是否为偶数/
q--;/指针向前移动/
if (p>q)
break;
temp=p;
p=q;
q=temp;
p++,q--;/
指针相向移动
/
}
}

- 问题分析:(重点分析在实验过程中出现的问题,及解决方法。)
这个程序需要用到两个指针p,q,p向后移动直到遇到偶数,q向前移动,直到遇到奇数,然后将p、q所指位置进行交换,继续循环。
- 程序运行结果如下:</font>
![](https://img2018.cnblogs.com/blog/1617039/201906/1617039-20190613121025772-414102635.png)
<font color="black" size = "3px">
##三、实验小结(在本次实验中收获与不足)
这节实验课是进行关于指针的运用的一些实验,让我进一步地熟悉了指针的定义、通过指针怎么间接访问变量、怎么实现指针与数、字符串的结合,但有时还是搞不清楚表示指针的值,指针的地址,还有参数传值还是传址的区别。
/font>
posted @ 2019-06-15 18:13  longmeiluo  阅读(304)  评论(0编辑  收藏  举报