C语言程序设计实验报告(第八章 指针)

C程序设计实验报告

姓名:黄静微  实验地点:宿舍  实验时间:2020.06.02

实验项目

8.3.1 指针基础及指针运算
8.3.2 数据交换
8.3.3 字符串反转及字符串连接
8.3.4 数组元素奇偶排列

一、实验目的与要求

  • 加强对指针数列的理解
  • 熟悉指针的定义、通过指针间接访问变量的方法
  • 理解指针类型作为函数传递的方法
  • 熟悉对字符指针及将指针作为函数打返回类型的操作
  • 加强对使用指针对数组进行操作的理解

二、实验内容

1、实验练习: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的地址,并与上面的结果进行比较。
实验代码:

#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);        
	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 Adress of c:%x,%x\n",p,&c);	     
 } 

问题分析: 这个问题主要是要熟悉指针的定义和通过指针间接访问变量的方法,了解了基本的知识就没什么问题,注意一下不要犯小错误,很顺利地完成了这个实验。
运行结果:

2、实验练习:8.3.2 数据交换

问题的简单描述:
(1)定义两个函数,分别为void swap1(int a,int b)和void swap2(int *a, int *b),用于交换a,b的值。
(2)从主函数中分别输入两个整形变量a、b。
(3)从主函数中分别调用上述两个交换函数,并打印输出变换后a,b的结果。
实验代码:

#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地址上的值*/
}

问题分析:在填swap2的时候出现了问题,swap2的实参传递是a,b的地址,不是a,b,刚开始填的时候直接填a,b就不行,实验指导书上有说当使用指针作为形参时,实参必须是地址,也应是数组名。还有一点老师在上理论课的时候有说*x*y交换的时候temp前面不需要加*,加了*表示的是地址交换,就不是值传递,这点在实验的时候也需要注意。
运行结果:

3、实验练习:8.3.3 字符串反转及字符串连接

问题的简单描述:
(1)定义两个字符指针。
(2)定义一个函数char *reverse(char *str),通过指针移动方式将字符串反转。
(3)定义一个函数char link(charstr1,char *str2),通过指针移动方式将两个字符串连接起来。
(4)从主函数中分别调用上述函数,输入字符串并打印输出结果。
实验代码:

#include<stdio.h>
char *reverse(char *str);
char *link(char *str1, char *str2);
main()
{
    char str[30], str1[30], *str2;
    printf("input reversing character string:");
    gets(str);
    str2=reverse(str);
    printf("\noutput reversed character string:");
    puts(str);
    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;
         p--;               //指针做相向移动处理
         q++;                   
    }
    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;
}

问题分析: 这个实验在理解指针做相向移动处理的比较费劲,有些语句不是很理解,通过老师讲解思路更清晰了。这里的第一个while里面的p++是它内部的,后面的p--是因为第一个while是对每个字符进行判断,跳出循环后p指向了\0,所以p--使它回到\0的前一个字符进行调换。第二个while对尾部的字符调换,所以是q++,p--。
运行结果:
<img src="https://img2020.cnblogs.com/blog/1940817/202006/1940817-20200602104037104-489856574.png width="60%">

4、实验练习:8.3.4 数组元素奇偶排列

问题的简单描述:
(1)定义一个整型一维数组,任意输入数组的元素,其中包括奇数和偶数。
(2)定义一个函数,实现将数组元素奇数在左,偶数在右的排列。
(3)在上述定义的函数中,不允许在增加新的数组。
(4)从主函数中分别调用上述函数,打印输出结果。
实验代码:

#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--;
	}
}

问题分析: 一开始写完这个程序的时候运行出来的输出结果数字与数字之间没有间隔,就是一长串的数字,但是顺序是对的,通过对代码的再次检查,在输出后面加上空格,就得到了正确的格式,这种小问题发现比较难,在打代码的时候就要留心。
错误运行结果

运行结果:

四、实验小结

  这一章的实验比较少,一共是4个实验,但通过实验还是反映出比较多的问题,我感觉第八章的指针比较难理解,比较头疼指针,通过老师讲解实验理解会好很多,思路也更清晰很多,但还是要多去理解,也有些东西需要去记忆。比如:一个字符串在内存中是连续存储的,它的开始地址为指向字符串的指针值,字符串的结束字符为\0。当使用指针作为形参时,实参必须是地址,也应是数组名。总之还是要多去理解代码,多从错误中学习吧,这样学习指针会好好一点,加油吧。

posted @ 2020-06-02 11:27  JSZ-Angel  阅读(3402)  评论(0编辑  收藏  举报