C语言学习 第十一次作业总结
作业总结
两次的作业,都是和指针有关。从第一次的作业开始,我就多次让同学们思考这个问题:为什么要用指针,为什么在函数的形参中要使用指针。如果能够想明白这2个问题,那么同学们应该会指针的了解就差不多足够了,剩下的,就是充分的代码练习。
其实,总的来说,指针这一概念本身很简单,理解起来也并不复杂——指针是一个变量,内部存储的是一个地址,这个地址指向其他的变量/函数(也有可能是空)。
用C语言来表述,就是先声明一个指针,在定义它:
// 以 int 类型为例
int *point; // 声明一个变量,这个变量是一个指针变量
int a;
point = &a; // 定义这个point指向变量a。
int b;
point = &b; // 将 point 指向 b
*point = 5; // 将 b 的值赋值为 5
但是,这里有一个地方特别容易让新手混淆:
int *pointa = &a; // ① 在这种声明的同时定义的,有 * 号
int b;
int *pointb;
pointb = &b; // ② 在定义的时候,假如想要让指针指向一个目标,是不需要 * 号的
*pointa = b; // ③ 当需要对这个指针变量进行解引用,就需要一个 * 号(解引用符号)
虽然仅仅是很简单的几句代码,但是在经验不足的情况下,非常容易混淆,同学们需要在这里多多锻炼。
这里,仅列举几个同学们经常遇到的错误示例:
void findMax(int x,int y,int *pmax){
int *px,*py,max;
*px = x;
*py = y;
if(*px < *py)
max = *py;
else
max = *px;
}
// 调用
int main(){
int x,y,*px,*py,max;
scanf("%d%d",&x,&y);
findMax(*px,*py,&max);
}
在以上的代码中,同学们出现了以下的错误:
- 学了指针,就一下子忘记函数形参是普通变量的直接传普通变量就可以;
- 指针没有定义就直接使用;
findMax
函数中对指针的运用也不熟练,需要先做一个转换再去使用。
int main(){
float op1,op2,*psum,*pdiff;
scanf("%f%f",&op1,&op2);
sum_diff(op1,op2,&*psum,&*pdiff);
}
void sum_diff(float op1,float op2,float *psum,float *pdiff){
*psum = op1 + op2;
*pdiff = op1 - op2;
}
这个关于指针的错误使用的例子,大家可以自己看看都有哪些错误。
函数的指针传参
必须使用指针传参
首先,我们来看这样的一个函数:
void swap(int *numa,int *numb);
这个函数的目标是:对于传入的两个数,对他们进行交换。根据之前学习到的知识,想要交换两个数,是很容易实现的:
int temp;
temp = numb;
numb = numa;
numa = temp;
现在,开始讨论这个函数,思考为什么需要传入指针的一种情况:
// 现在假设函数的原型是
void swap(int numa,int numb);
首先,需要大家有这样的一个意识: 函数传参,传递的都是一个数值
。这个概念的理解请不要偏颇,这里的数值的含义较为狭窄:就是一个数。(这句话是不是要单独开一个博文写写呢?)
比如,对于swap
函数,如果是下面的方式进行调用:
int a = 3,b = 5;
swap(a,b); // swap(3,5);
在这里,对函数传入参数a
和b
,和后面的注释中那样传递入3和5是没有本质的差别的。而根据前面的学习,大家可以知道,字面常量是无法存储数据的,所以函数中的交换操作自然无法达成。
而对于swap
函数的形参是指针的情况,因为传入的是地址这个“常量”,最终在函数内部需要利用解引用符号找到对应的内存空间,所以能够实现数据的交换。
数组只能使用指针传参
另一种需要传递指针的情况就是数组了,之前在学习中大家也写过几个相关的例子,同时也知道了一般在向函数传递数组的时候,还需要跟随一个数组的长度值。
为了减小传参的体积
之前大家简单的学习了结构体的相关知识。在写代码的时候,结构体中的变量可能并不多,但是大家考虑一个有100个变量的结构体,是不是意味着需要将这100个变量的值都赋值给函数呢。如此,内存开销势必增加。所以对于这样的情况,也会传递给函数结构体的指针。之所以结构体能够传递指针,是因为结构体有一个性质和数组十分类似:它在内存中也是连续存储的(严格来说结构体本身是可能存在空隙的,但是总的来说它还是连续的)。
作业成绩统计
编号 | 学号 | Cnblogs昵称 | 代码 | 总结 | 抄袭行数 | 加权得分 | 备注 |
---|---|---|---|---|---|---|---|
1 | 160809401 | 付胤 | 70 | 70 | 52 | 38.8 | 代码有一题没有做 |
2 | 160809402 | 张博洋 | 0 | 0 | 0 | 0 | 完全看不懂写了些什么 |
3 | 160809403 | 董宇豪 | 85 | 50 | 23 | 57.2 | 最后一个代码没有写成一个函数 |
4 | 160809404 | 朱念齐 | -100 | -100 | 0 | -100 | |
5 | 160809405 | 芦彦儒 | -100 | -100 | 0 | -100 | |
6 | 160809406 | ------ | ------ | ------ | ------ | ------ | ------ |
7 | 160809407 | Leonardo#* | -100 | -100 | 0 | -100 | |
8 | 160809408 | iL.linker | 50 | 80 | 34 | 41.6 | 第三题没有写,第二题代码有误 |
9 | 160809409 | gdcs16_409 | 85 | 90 | 82 | 37.8 | |
10 | 160809410 | 无声的梦 | 90 | 90 | 0 | 90 | |
11 | 160809411 | 刘悦 | -100 | -100 | 0 | -100 | |
12 | 160809412 | 张磊 | -100 | 80 | 0 | -28 | |
13 | 160809413 | 王洪烨 | 90 | 65 | 89 | 26.6 | 作业明显没有之前认真 |
14 | 160809414 | 纪柏如 | 70 | 80 | 20 | 62 | |
15 | 160809415 | 闫墨杰 | -100 | -100 | 0 | -100 | |
16 | 160809416 | 史航 | 70 | 90 | 49 | 48.6 | |
17 | 160809417 | 狂欢 | -100 | -100 | 0 | -100 | |
18 | 160809418 | 水母Jam | 85 | 75 | 92 | 25.8 | 代码稍有错误 |
19 | 160809419 | 朱钰铖 | -100 | -100 | 0 | -100 | |
20 | 160809420 | 虞小生 | 70 | 85 | 21 | 63.4 | |
21 | 160809421 | 饮冰少年1 | 90 | 60 | 39 | 54.6 | |
22 | 160809422 | ----------- | ------ | ------ | ------ | ------ | ------ |
23 | 160809423 | 李筱 | -100 | -100 | 0 | -100 | |
24 | 160809424 | Xzy! | 70 | 60 | 46 | 38.4 | |
25 | 160809425 | 刹那神华 | -100 | 50 | 0 | -40 | 没有找到代码 |
26 | 160809426 | zlt.Santorini'Ly | 85 | 85 | 92 | 29.8 | |
27 | 160809427 | 江超民 | 85 | 65 | 83 | 27.2 | |
28 | 160809428 | zxkai | 85 | 60 | 83 | 25.2 | 勇于承认抄袭“第三题实在不会 复制了同学的” |
29 | 160809429 | 王鑫沐 | 75 | 85 | 80 | 31 | |
30 | 160809430 | 茉妍 | 75 | 70 | 80 | 25 | |
31 | 160809431 | 茉莉雨 | 85 | 90 | 0 | 87 |
C语言学习 第十一次作业总结的更多相关文章
- C语言学习 第七次作业总结
C语言学习 第七次作业总结 数组可以分为数组和多下标数组(在传统的国内C语言书本中,将其称为二/多维数组). 数组名称 在之前的课程中,大家应该都有印象,对于int a这样的定义,会为变量 a 声明一 ...
- Go语言学习笔记十一: 切片(slice)
Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用.不像java语言写起来就比较繁琐.不过我觉得未来java语法也会支持的. 定义切片 ...
- C语言学习 第八次作业总结
本次作业其实没有新的内容,主要就是复习上一次的一维数组的相关内容.冯老师布置了5道题目,其中涉及到一些比较简单的排序或者是查找的方法.因为数据很少,所以直接使用for循环遍历就可以了. 关于本次作业, ...
- C 语言学习 第三次作业总结
本次作业内容: For循环的使用 If判断语句的使用 常用数学运算表达式的使用 数学函数库中几个常见函数的使用及自我实现 将操作代码提交到coding 作业总结: For循环是C语言中一种基本的循环语 ...
- C 语言学习 第12次作业总结
作业总结 本次课堂的内容为字符串相关的几个函数还有结构体. 字符串相关函数 在此之前的课程中,输入主要都是使用scanf这个函数.而在这节课上,冯老师讲解了字符串获取函数gets.在不需要控制符的情况 ...
- C 语言学习 第六次作业总结
本次作业,同学们开始学习函数.通过之前和同学们的沟通,似乎同学们在这里遇到的问题比较多.下面,我先帮同学们整理下函数的相关知识点. 什么是函数 首先,需要明确的是,什么是函数.所谓函数,也就是一段有名 ...
- C语言程序设计第十一次作业
同学们,一晃一个学期就过去了,第一节课时,我曾做过一个调查,没有一个同学在中学阶段接触过程序设计,也就是说,那时,大家都是零基础,或许只是听说过"C语言"这个词,但其他便一无所知了 ...
- C 语言学习 第五次作业总结
第五次作业,主要学习和复习的是几种循环结构的使用. 在前一次的课堂上,同学们已经学习了分支语句的使用.分支语句和循环语句配合使用,就可以写出更多的,逻辑功能丰富的代码了. 逻辑功能的丰富,也意味着学习 ...
- C语言学习 第四次作业总结
本次作业主要为了复习分支语句,同时复习之前学习过的判断语句,printf和scanf函数的使用. 学习到这里,同学们应该已经基本掌握了基本的数据类型,分支结构,循环结构,条件判断语句.应该可以利用这些 ...
随机推荐
- DataTable的orderby有关问题
在网上找了一个在后台重新对DataTable排序的方法(之所以不在数据库是因为我生成的是报表,写了存储过程用的表变量,order by也要用变量,死活拼不起来,sql能力没过关,动态sql也试了) s ...
- 是时候 UWP 了 !
什么是 UWP? 很多程序员都有一个梦想:希望自己开发的软件能够轻而易举的在所有平台上运行,而不是把同样的需求,用不同的技术.工具重新开发才能够运行在所有平台上.这就是跨平台,很多软件从业者都在为这个 ...
- JDBC——Java代码与数据库链接的桥梁
常用数据库的驱动程序及JDBC URL: Oracle数据库: 驱动程序包名:ojdbc14.jar 驱动类的名字:oracle.jdbc.driver.OracleDriver JDBC URL:j ...
- HTML5 数据集属性dataset
有时候在HTML元素上绑定一些额外信息,特别是JS选取操作这些元素时特别有帮助.通常我们会使用getAttribute()和setAttribute()来读和写非标题属性的值.但为此付出的代价是文档将 ...
- SpringMVC + Spring + MyBatis 整合 + Spring shrio + easyUI + 权限管理框架,带shrio session和shrio cache集群实现方案
工作之余先来写了一个不算规范的简单架子 基于spring mvc + spring + mybatis + Spring shrio 基于redis的集群方案 系统权限部分,分成多个机构,其中每个机构 ...
- 【web前端面试题整理08】说说最近几次面试(水)
为什么换工作 换工作简单来讲一般会归纳为钱不够或者人不对,我们团队氛围很不错,所以基本就定位到钱不够了,而我更多是考虑到以后的职业发展,简单说来就是对以后几年的工作有想法,而这种想法实现不一定能在现在 ...
- Mysql(windows)安装
h3 { color: rgb(255, 255, 255); background-color: rgb(30,144,255); padding: 3px; margin: 10px 0px } ...
- BPM实例分享——日期自动计算
日期自动计算 在请假流程中通常我们需要获得请假开始到请假结束时间的天数,那么请假天数(可结合工作日历)是怎么实现系统计算呢?下面我们来看下配置的方法. 1. 首选建立业务服务BPMService, ...
- Stimulsoft入门视频
.NET框架下最全面的报表解决方案,支持多种报表导出格式,拥有简单且强大的报表引擎.本系列教程适合Stimulsoft Reports上手入门. 001 Stimulsoft Reports. ...
- MAC的SVN怎么设置允许.a文件上传
首先在mac中svn的安装会去选择Cornerstone 如果遇到这个问题肯定是已经安装并准备上传.a 文件了.首先要清楚svn是默认过滤忽略.a文件的上传的,要想可以上传.a 可以通过这个简单的方法 ...