程序设计基础与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

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);

相关文档
最新文档