实验项目:指针实验
姓名:张时锋 实验地点: 514物联网实验室 实验时间:2019年6月12日
实验项目
8.3.1 指针基础及指针运算
8.3.2 数据交换
8.3.3 字符串反转及字符串连接
8.3.4 数组元素奇偶排列
一、实验目的和要求
1、指针基础及指针运算
本实验旨在加强学生对指针数据类型的理解,熟悉指针的定义、通过指针间接访问变量。
2、数据交换
本实验旨在加强学生对指针类型作为函数参数传递的理解,通常将实参传递给形参时,有两种方式,即按值传递和按地址传递,其中指针类型参数即是按地址传递。
3、字符串反转及字符串连接
本实验旨在加强学生对字符指针以及将指针作为函数的返回类型的理解,并通过指针对字符串进行操作,通常来说,一个字符串的内存中是连续存放的,其开始地址为指向该字符串的指针值,字符串均为'\0'作为结束字符。
4、数组元素
本实验旨在加强学生对使用指针对数组进行操作的理解,通常数组的名称即整个数组的起始存储地址,可以定义一个指针指向它,然后通过指针移动访问各个数组成员。
二、实验内容
8.3.1、指针基础及指针运算
1、问题描述
定义一个整型指针变量p,使'yi它指向一个整型变量a,定义一个浮点型指针q,使它指向一个浮点型变量b,同时定义另外一个整型变量c并赋值初值3 。使用指针变量,调用scanf函数分别输入a和b的值。通过指针间接访问并输出a、b的值。按16进制方式输出pq的值以及a、b的地址。将p指向c,通过p间接访问c的值并输出。输出p的值以及c的地址,并与上面的结果进行比较。
2、实验代码
1 #include <stdio.h> 2 int main() 3 { 4 int *p,a,c=3; 5 float *q,b; 6 p=&a; 7 q=&b; 8 printf("请输入a,b的值:"); 9 scanf("%d%f",&a,&b);//**使用指针p和q输入a,b的值**// 10 printf("result:\n"); 11 printf(" %d,%f\n",a,b); 12 printf(" %d,%f\n",*p,*q);//**使用指针p和q间接输入a,b的值**// 13 printf("The Address of a,b:%p,%p\n",&a,&b);//**输出p和q的值并和上行输出结果进行比较**// 14 printf("The Address of a,b:%p,%p\n",p,q);//**输出p的值和c的地址**// 15 printf("c=%d\n",*p); 16 printf("The Address of c:%x,%x\n",p,&c); 17 return 0; 18 }
3、运行结果
4、问题分析:无。
8.3.2、数据交换
1、问题描述
定义两个函数,分别为void swap1(int a,int b)和void swap2(int a,int b),用于交换a,b的值。
从主函数中分别输入两个整形变量a、b。
从主函数中分别调用上述两个交换函数,并打印输出交换后a、b的结果。
2、实验代码
1 #include <stdio.h> 2 void swap1(int x,int y); 3 void swap2(int *x,int *y); 4 int main() 5 { 6 int a,b; 7 printf("please input a=:"); 8 scanf("%d",&a); 9 printf("\n b=:"); 10 scanf("%d",&b); 11 swap1(a,b); 12 printf("\n After call swap1: a=%d b=%d\n",a,b); 13 swap2(&a,&b);//**实参传递**// 14 printf("\n After call swap1: a=%d b=%d\n",a,b); 15 return 0; 16 } 17 void swap1(int x,int y) 18 { 19 int temp; 20 temp=x; 21 x=y; 22 y=temp; 23 } 24 void swap2(int *x,int *y) 25 { 26 int temp; 27 temp=*x;//**交换x,y地址上的值**// 28 *x=*y; 29 *y=temp; 30 }
3、运行结果
4、问题分析:主要是形参和实参的传递,swap1中传递的是实参的值,swao2中传递的是实参的地址。
8.3.3字符串反转字符串连接
1、问题描述
定义两个字符指针,通过gets()函数输入两个字符串。
定义一个函数charreverse(charstr),通过指针移动方式将字符串反转。
定义一个函数char link(charstr1,char*str2),通过指针移动方式将两个字符串连接起来。
从主函数中分别调用上述函数,输入字符串并打印输出结果。
2、实验代码
1 #include <stdio.h> 2 #include <conio.h> 3 char *reverse(char *str); 4 char *link(char *str1,char *str2); 5 int main() 6 { 7 char str[30],str1[30],*str2; 8 printf("Input Reversing Character String:"); 9 gets(str); 10 str2=reverse(str); 11 printf("\n Output Reversed Character String:"); 12 puts(str2); 13 printf("Input String1:"); 14 gets(str); 15 printf("\n Input String2:"); 16 gets(str1); 17 str2=link(str,str1); 18 puts(str2); 19 return 0; 20 } 21 char *reverse(char *str) 22 { 23 char *p,*q,temp; 24 p=str,q=str; 25 while(*p!='\0')//**判断是否到达最后一个字符**// 26 p++; 27 p--; 28 while(q<p) 29 { 30 temp=*q; 31 *q=*p; 32 *p=temp; 33 q++; 34 p--;//**指针相向移动处理**// 35 } 36 return str;//返回结果**// 37 } 38 char *link(char *str1,char *str2) 39 { 40 char *p=str1,*q=str2; 41 while(*p!='\0') 42 p++; 43 while(*q!='\0') 44 { 45 *p=*q;//**q指向的元素赋值到p所指向的元素**// 46 q++; 47 p++;//指针移动处理**// 48 } 49 // putch('\0'); 50 *p=*q;//**令结束字符为空字符**// 51 return str1; 52 }
3、运行结果
4、问题分析:一开始不明白怎么倒过来,听了之后明白,就是指针的移动,通过指针位置来将指针的元素交换。
8.3.4、数组元素奇偶排列
1、问题描述
定义一个整形一维数组,任意输入数组的元素,其中包含奇数和偶数。
定义一个函数,实现将数组元素奇数在左,偶数在右的排列。
在上述定义的函数中,不允许再增加新的数组。
从主函数中分别调用上述函数,打印输出结果。
2、实验代码:
1 #include <stdio.h> 2 #define N 10 3 void arrsort(int a[],int n); 4 int main() 5 { 6 int a[N],i; 7 printf("输入:"); 8 for(i=0;i<N;i++) 9 scanf("%d",&a[i]); 10 arrsort(a,N); 11 printf("输出:"); 12 for(i=0;i<N;i++) 13 printf(" %d",a[i]); 14 } 15 void arrsort(int a[],int n) 16 { 17 int *p,*q,temp; 18 p=a; 19 q=a+n-1; 20 while(p<q) 21 { 22 while(*p%2!=0)//**判断*p是否为奇数**// 23 { 24 p++;//指针后移动// 25 } 26 while(*q%2==0)//**判断*p是否为偶数**// 27 q--;//指针前移动// 28 if(p>q) 29 break; 30 else 31 { 32 temp=*p; 33 *p=*q; 34 *q=temp; 35 p++; 36 q--;//指针相向移动// 37 } 38 } 39 }
3、运行结果
4、问题分析:可以根据之前的题目以此类推。
三、实验小结
1、变量可以改变但是变量的地址是不变的。
2、指针作为形参时,实参是地址
3、形参的交换不会对实参有影响