《C语言程序设计》第3次作业讲评

发布 2023-05-20 23:00:28 阅读 4124

《c++语言程序设计》第三次作业讲评。

说明:本次作业对应教材第。

六、七章的内容。

讲评】本章主要考核大家对指针的概念的理解,要求掌握指针变量的定义和初始化、指针的各种操作、一维数组元素的下标访问方式与指针访问方式及其之间的转换、引用的概念以及动态空间管理等内容。内容相对前面章节比较难,希望通过作业讲评能够帮助大家把学习中的难题一一解决。下面是对部分问题的讲评。

一、填空题。

1.假定p所指对象的值为28,p+1所指对象的值为62,则* p + 的值为 28 。

讲评】这中题目比较难,因为前++和后++的操作本来对大家来说就很迷糊,再加上指针的操作就更乱了,其实只要理清思路,这中问题不难做,最好在纸上画一个图更容易理解。

为了便于理解,我们先将p这个指针所指的地址假设为1000,那么在内存1000处,就存放这28这个值,而下一个单元即1004处存放着62这个值。如下左图。

这里*p++的操作相当于*(p++)先执行括号内的操作p++,注意无论是p++还是++p,最终的结果都会使p增1,因为p是一个指针,那么增1的操作实际上就是使得p的值增加一个单元的字节数4,p的值变为1004,也就是使p指向下一个单元。但注意这里是后增1的操作所以表达式(p++)取值应该取增1之前的原来p的值1000,在执行*的操作,就是取1000处的数据,显而易见为28。

但执行完成后,p的所指的值为62,如上右图所示。注意题目的问法。

2.假定p所指对象的值为28,p+1所指对象的值为62,则* +p的值为 62 。

讲评】同上一题比较,这里将原来的后++操作变成了前++,具体的就不阐述了,这次表达式在取值的时候取得是p增1之后的值即1004处的数据62。

3.假定p所指对象的值为25,p+1所指对象的值为50,则执行“(*p)+ 语句后,p所指对象的值为 26 。

讲评】注意这个题目的问法和上面两个不一样,这个问执行整个语句后,p所指的值,而上面两题的问法是整个表达式的值。

你在完成时,还是用上面的方法——画图。

*p)+ 的执行过程,应该先执行括号内的操作。取当前p所指对象的值25,再另其进行后增1的操作,那么此处的25应该变为26,注意这里没有问“(*p)+ 的值是什么”,如果问了,那么(*p)+ 的值应该是增1之前的值25,而这个题问你的是,语句执行后,p所指对象的值,所以为26。

4.假定p所指对象的值为25,p+1所指对象的值为50,则执行“*(p+ +语句后,p所指对象的值为 50 。

讲评】根据上面的方法可自己分析。

5.假定a是一个指针数组,则a+i所指对象的地址比a地址大 4*i 字节。

讲评】参看教学辅导第六章的内容,里面有图帮助理解,后面的几个题目也是如此。

6.假定a是一个一维数组,则a[i]的指针访问方式为 *(a+i) 。

7.假定a是一个二维数组,则a[i] [j]的指针访问方式为 *(a[i]+j) 或*(*a+i)+j) 。

8.假定a是一个一维数组,则a[i]对应的存储地址(以字节为单位)为 a+i*sizeof(a[0])

9.假定一个二维数组为a[m] [n],则a[i] [j]对应的存储地址(以字节为单位)为 a+(i*n+j)*sizeof(a[i][j

10.假定一个二维数组a[m] [n],则a[i]的地址值(以字节为单位)为 a+(i*n)*sizeof(a[0][0]) 或a+i*sizeof(a[i])

11.假定p是一个指向float型数据的指针,则p+1所指数据的地址比p所指数据的地址大 4 字节。

12.假定a为一个字符数组名,则元素a[8]的字节地址为 a+8 。

13.假定a为一个整型数组名,则元素a[4]的字节地址为 a+16 。

14.假定一个结构类型的定义为“struct a{int a,b;short c;a*d;};则该类型的大小为 14 字节。

讲评】这种题目考题中经常出现,先把结构中有几个成员搞清楚,结构类型的大小就是它的所有成员所占空间大小之和。这里结构体a中共有4个成员:整型变量a和b,短整型变量c,结构体a型指针变量d,a、b、c共占有4+4+2=10个字节的空间,容易搞错的是d所占字节数,记住不管是什么类型的指针变量永远占有4个字节。

所以答案是14个字节。

15.假定一个结构类型的定义为“struct b{int a[8];char* b;};则该类型的大小为 36 字节。

讲评】这个应该不难理解,4×8+4=36

16.假定一个结构类型的定义为“struct d{int a;union{int b;double c;};d*d[3];}则该类型的大小为 24 字节。

讲评】这里容易错的是中间的联合体union部分,注意结构体d中只有三个成员而不是四个,因为中间的联合体只取其中一个成员,所占空间就是它的所有成员中占空间最大的那个,所以联合所占空间为8个字节(来自double c)。对于指针数组d所占的空间,不要搞错,这个数组共有3个元素,每个元素都是指针,而每个指针都占4个字节,所以该数组所占空间为4×3=12个字节,本题答案是:4+8+12=24字节。

17.假定要动态分配一个类型为worker的具有n个元素的数组,并由r指向这个动态数组,则使用的语句为 worker *r=new worker[n];

18.假定要访问一个结构x中的由a指针成员所指向的对象,则表示方法为 *(

19.假定要访问一个结构指针p所指对象中的b指针成员所指的对象,则表示方法为 *(p->b) 。

二、给出下列程序运行后的输出结果。

1.#include<>

void main(){

int a[8]={7,9,11,13,3,8,15,17};

int *p = a;

for(int i =0;i<8;i +

cout

讲评】这个程序的关键之处在于指针p和数组a的关系,第一条语句定义了一个整型数组a并进行初始化,第二条语句定义了一个整型指针p,并用数组名对其赋值,这就使得p指向数组,成为a[0]的地址,第三条语句是一个for循环,通过*p++的操作依次访问数组中的元素,循环体中的第一条语句是按照规定格式(setw(5)是另其后面输出的数据占据5个字符的位置)输出当前p所指的数组元素,然后使得p指向下一个单元,第二条语句是控制每行输出四个元素后输出一个回车换行。

2.#include<>

void main(){

int a[5]={3,6,15,7,20};

int *p = a;

for(int i = 0;i<5;i +

cout

cout

讲评】这个程序的第一个循环和上面一题的访问数组元素并输出是一样的,执行第二个循环时,p已经指向数组最末元素20的下一个单元,通过--p,先将p向前移动一个单元,指向20,在利用*操作将当前元素输出,达到反序输出数组元素的目的。

3.#include<>

void main(){

int a[8] =4,8,12,16,20,24,28,32};

int *p = a;

do{cout<< p <<

p + 3;

while(pcout<}

讲评】前两条语句不用说了,第三条语句是一个do循环,第一次进入循环输出当前p所指的元素是4,通过p+=3的操作,使得p向后移动3个单元,指向a[3]即16,判断当前的循环条件p4.#include<>

void main(){

int x =20,y =40, *p;

p =&x;//此时的状态参看图1

cout<< p<<

p= x +10; /此时的状态参看图2

p =&y;//此时的状态参看图3

cout<< p<* p = y +20;//此时的状态参看图4

cout<< x <

讲评】这个题目可以根据下图完成,具体参看上面的注释。

5.#include<>

int la(int * a,int n){

int s = 0;

for(int i =0;is + a[i];

return s;

void main(){

int a[ ]5,10,15,20,25,30};

int b =la(a,5);

int c =la(a+3,2);

cout<< b <

C语言程序设计第2次作业

学习中心学号姓名 注意 作业完成后在规定时间内提交,提交时在 文件名称 和 注释 处也要写清楚 学习中心,学号,姓名,入学时间 以便登记你的作业成绩。一 单项选择题。1 若有以下定义 int a p a 则值为5的表达式是。a p 5,p 1 b p 1,p c p 4,pd p 1,p 2 下面函...

C语言程序设计作业

程序设计报告。课程名称 c语言程序设计 题目名称。学生学院 管理学院 专业班级 市场营销1 班 学号。学生姓名。指导教师。2010年 06 月20日。第一题。流程图 算法说明 数据输入部分就不用说了,就是简单的使用了for循环结构。对于sort函数部分,最主要的是数据排序部分。此排序法使用了冒泡排序...

“C 语言程序设计”作业

教育部人才培养模式。改革和开放教育试点。c 语言程序设计。形成性考核册。学校名称 学生姓名 学生学号 班级 广播电视大学出版社。计算机应用专业 c 语言程序设计 课程作业。第一次作业。一 填空题。1 c 语言中的每条基本语句以作为结束符,每条复合语句以作为结束符。2 用于输出表达式值的标准输出流对象...