程序设计基础与C语言实验-指针
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序设计基础与C语言实验-指针
1.实验目的
●熟练使用指针编程解决问题
●区分指针和指针变量,二维数组的联系和区别
●设置二维数组作实参,将数据传递给指针形参
●用字符数组名和字符指针变量分别表示实参和形参,调用函数实现字
符串的复制
●定义多重指针解决问题,指向指针数组的首元素
2.实验内容
●题目-1 P248 例8.11 输出二维数组的有关数据
(1)问题分析:
0行起始地址和0行0列元素地址相同。1行0列元素地址和1行起始地址的值比0行起始地址大16字节(一行有4个元素,每个元素4个字节)。
(2)算法设计与流程图:
S1:设定一个二维数组 a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}
S2:输出a,*a
S3:输出a[0],*(a+0)
S4:输出&a[0],&a[0][0]
S5:输出a[1],a+1
S6:输出&a[1][0],*(a+1)+0
S7:输出a[2],*(a+2)
S7:输出&a[2],a+2
S8:输出a[1][0],*(*(a+1)+0)
S9:输出*a[2],*(*(a+2)+0)算法结束
(3)程序清单:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{int a[3][4]={1,3,5,7,9,11,13,15,171,19,21,23};
printf("%d,%d\n",a,*a);
printf("%d,%d\n",a[0],*(a+0));
printf("%d,%d\n",&a[0],&a[0][0]);
printf("%d,%d\n",a[1],a+1);
printf("%d,%d\n",&a[1][0],*(a+1)+0);
printf("%d,%d\n",a[2],*(a+2));
printf("%d,%d\n",&a[2],a+2);
printf("%d,%d\n",a[1][0],*(*(a+1)+0));
printf("%d,%d\n",*a[2],*(*(a+2)+0));
return 0;
}
(4)运行结果:
(5)结果分析:
a数组的起始地址19922416,在不同的计算机、不同的编译环境、不同的时间运行该程序时,由于分配内存情况不同,所显示的地址可能是不同的。
题目-2 P248 例8.15 查找不及格的学生并输出成绩
(1)问题分析:
在主函数中定义二维数组score,定义search函数实现输出一门以上课程不及格的学生的全部课程的成绩,形参p的类型是float(*)[4],p是指向包含4个元素的一维数组的指针变量。在调用search函数时,用score作为实参,指向score[0],把score[0]的地址传给形参p。
(2)算法设计与流程图:
S1:定义search函数,形参p的类型是float(*)[4]
S2:定义二维数组score[3][4]
S3:调用search函数,指向score[0]
S4:令int i=0,j=0,n=12
S5:如果j S6:i=i+1,执行S5 S7:输出j+1,算法结束 (3)程序清单: #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) {void search(float(*p)[4],int n); float score[3][4]={{65,55,66,79},{75,98,78,65},{56,67,85,43}}; search(score,3); return 0; } void search(float(*p)[4],int n) {int i,j ,flag; for(j=0;j {flag=0; for(i=0;i<4;i++) if(*(*(p+j)+i)<60)flag=1; if(flag==1) {printf("第%d个学生不及格,他/她的成绩是:\n",j+1); for(i=0;i<4;i++) printf("%5.1f",*(*(p+j)+i)); printf("\n"); } } } (4)运行结果: (5)结果分析: 在调用search函数时,p得到实参score的值,即score[0]的起始地址,p 指向score数组的第1行。然后p先后指向各行。p+j是score数组第j行的起始地址,*(p+j)是score[j][0]元素的地址,*(p+j)+i是score[j][i]元素的地址,*(*(p+j)+i)就是score[j][i]。 题目-3 P259例8.20 用函数调用实现字符串的复制 (1)问题分析: 定义一个函数copy用来实现字符串控制的功能,在主函数中调用此函数,函数得形参和实参可以分别用字符数组名或字符指针变量。 (2)算法设计与流程图: S1:设置数组a为"I am a teacher.",数组b为"You are a student." S2:输出string a=I am a teacher. string b=You are a student. copy a to string b: S3:定义copy函数 S4:输出string a=I am a teacher. string b=I am a teacher. 算法结束 (3)程序清单: #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) {void copy(char from[],char to[]); char a[]="I am a teacher."; char b[]="You are a student."; printf("string a=%s\nstring b=%s\n",a,b); printf("copy a to string b:\n"); copy(a,b); printf("\nstring a=%s\nstring b=%s\n",a,b);