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函数的使用. 学习到这里,同学们应该已经基本掌握了基本的数据类型,分支结构,循环结构,条件判断语句.应该可以利用这些 ...
随机推荐
- Java进击C#——语法之线程同步
上一章我们讲到关于C#线程方向的应用.但是笔者并没有讲到多线程中的另一个知识点--同步.多线程的应用开发都有可能发生脏数据.同步的功能或多或少都会用到.本章就要来讲一下关于线程同步的问题.根据笔者这几 ...
- 通过HTML5的Drag and Drop生成拓扑图片Base64信息
HTML5 原生的 Drag and Drop是很不错的功能,网上使用例子较多如 http://html5demos.com/drag ,但这些例子大部分没实际用途,本文将搞个有点使用价值的例子,通过 ...
- 利用WCF的双工通讯实现一个简单的心跳监控系统
何为心跳监控系统? 故名思义,就是监控某个或某些个程序的运行状态,就好比医院里面的心跳监视仪一样,能够随时显示病人的心跳情况. 心跳监控的目的是什么? 与医院里面的心跳监视仪目的类似,监控程序运行状态 ...
- WinServer2008R2 + IIS 7.5 + .NET4.0 经典模式 运行WebAPI程序报404错误的解决方案
在Windows Server 2008 R2系统下,IIS 7.5 + .NET Framework 4.0的运行环境,以经典模式(Classic Mode)部署一个用.NET 4.0编译的 Web ...
- .NET 实现并行的几种方式(一)
好久没有更新了,今天来一篇,算是<同步与异步>系列的开篇吧,加油,坚持下去(PS:越来越懒了). 一.Thread 利用Thread 可以直接创建和控制线程,在我的认知里它是最古老的技术了 ...
- 在DevExpress程序中使用TeeList控件以及节点查询的处理
在很多情况下,我们需要通过树列表进行数据的展示,如一些有层次关系的数据,通过有层级的展示,能够使用户更加直观查看和管理相关的数据.在一般Winform开发的情况下,可以使用微软的TreeView控件, ...
- Office 365使用情况调查不完全分析报告
感谢大家参与了9月13日在Office 365技术群(O萌)中发起的一个关于Office 365使用情况的调查,在一天左右的时间内,我们一共收到了67份反馈,其中绝大部分是在3分钟内提交的. 本次调查 ...
- Animation
Animation 效果 用法 1.非常简单,导入两个文件(UIView+SetRect) (UIView+ImageEffects) 源码 github源码:https://github.com/m ...
- ASP.NET Core Web API Cassandra CRUD 操作
在本文中,我们将创建一个简单的 Web API 来实现对一个 “todo” 列表的 CRUD 操作,使用 Apache Cassandra 来存储数据,在这里不会创建 UI ,Web API 的测试将 ...
- 记录我的点点滴滴从此刻做起——iOS开发工程师
作为一个iOS工程师,想写博客也是有原因的:首先有这个想法(写博客的想法)也是因为想到自己都从事iOS开发快两年了,怎么也只会堆代码,写view,技术真的很一般,感觉都要被淘汰了:基于以上原因,自己也 ...