程序设计基础与C语言实验-指针

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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<n,i<4,*(*(p+j)+i)<60,输出*(*(p+j)+i),否则执行S7
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<n;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);
}
void copy(char from[],char to[])
{int i=0;
while(from[i]!='\0')
{to[i]=from[i];i++;}
to[i]='\0';
}
(4)运行结果:
(5)结果分析:
copy函数的作用是将from[i]赋给to[i],直到from[i]的值等于’\0’为止。

在调用copy函数时,将a和b第一个字符的地址分别传递给形参数组名from和to。

因此from[i]和a[i]是同一个单元,to[i]和b[i]是同一个单元。

题目-4 P281 例8.29 多重指针
(1)问题分析:
指针数组的元素只能存放地址,不能存放整数。

定义p是一个指向指针型数据的指针变量,开始时指向指针数组num的首元素num[0]。

(2)算法设计与流程图:
S1:定义一维数组a[5]={1,2,3,4,5},指针num指向a数组,指针变量p指向指针型数据
S2:p=num,i=0,如果i<5,输出p指向的指针型数据,否则执行S4
S3:i=i+1,p=p+1,执行S2
S4:输出换行字符,算法结束
(3)程序清单:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{int a[5]={1,2,3,4,5};
int*num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};
int **p,i;
p=num;
for(i=0;i<5;i++)
{printf("%d",**p);
p++;
}
printf("\n");
}
(4)运行结果:
(5)结果分析:
开始时p的值是&num[0],*p是num[0]的值,即&a[0],*(*p)是a[0]的值。

因此第1个输出的是a[0]的值1.然后执行p++,p就指向num[1],再输出**p,就是a[2]的值了,依次往后运行。

题目-5 P287 例8.30 动态数组的使用
(1)问题分析:
用malloc函数建立一个动态自由区域,用来存储5个学生的成绩,得到该动态域第一个字节的地址。

用一个基类型是int的指针变量p来指向动态数组的各元素,并输出它们的值。

(2)算法设计与流程图:
S1:定义指针变量p
S2:用malloc函数建立一个长度为5的动态自由区域
S3:i=0,如果i<5,输入数据存放到p1+i指向的地址中,执行S4,否则执行S6。

S4:如果p[i]<60,输出不合格的是:p[i]
S5:i=i+1,执行S3
S6:算法结束
(3)程序清单:
#include "stdafx.h"
#include "stdlib.h"
int _tmain(int argc, _TCHAR* argv[])
{void check(int *);
int *p1,i;
p1=(int *)malloc(5*sizeof(int));
for(i=0;i<5;i++)
scanf("%d",p1+i);
check(p1);
return 0;
}
void check(int *p)
{int i;
printf("不合格的是:\n");
for(i=0;i<5;i++)
if(p[i]<60)printf("%d",p[i]);
printf("\n");
}
(4)运行结果:
(5)结果分析:
把malloc函数返回的void指针转换为整型指针,然后赋给p1。

调用check函数,形参是int*指针。

题目6
(1)程序清单:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
printf("Smile\n");
return 0;
}
(2)运行结果:
(3)结果分析:运行正常
3.实验总结
调用函数实现字符串的功能可设置字符数组名和字符指针变量分别表示实参和形参。

熟练掌握二维数组,多重指针的要点。

相关文档
最新文档