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函数的使用. 学习到这里,同学们应该已经基本掌握了基本的数据类型,分支结构,循环结构,条件判断语句.应该可以利用这些 ...
随机推荐
- 扩展方法(C#)
扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 下面的示例为String添加 ...
- 怎样在Redis通过StackExchange.Redis 存储集合类型List
StackExchange 是由StackOverFlow出品, 是对Redis的.NET封装,被越来越多的.NET开发者使用在项目中. 绝大部分原先使用ServiceStack的开发者逐渐都转了过来 ...
- ImageSharp .NET Core跨平台图形处理库
ImageSharp 是支持.NET Core跨平台图形处理库,ImageSharp是ImageProcessor 的.NET Core跨平台实现. ImageSharp 支持如下操作: 调整大小,裁 ...
- StackExchange.Redis帮助类解决方案RedisRepository封装(散列Hash类型数据操作)
本文版权归博客园和作者本人共同所有,转载和爬虫请注明本系列分享地址:http://www.cnblogs.com/tdws/p/5815735.html 上一篇文章的不合理之处,已经有所修改. 今天分 ...
- php在没有登录的情况下自动跳转到登录页
<?php namespace Home\Controller; use Think\Controller; class BaseController extends Controller{ / ...
- 如何在Spring MVC Test中避免”Circular view path” 异常
1. 问题的现象 比如在webConfig中定义了一个viewResolver public class WebConfig extends WebMvcConfigurerAdapter { //配 ...
- JAVA的序列化和持久化的区别与联系
持久化(Persistence) 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘).持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中.XML数据文 ...
- 20个不可思议的 WebGL 示例和演示
WebGL 是一项在网页浏览器呈现3D画面的技术,有别于过去需要安装浏览器插件,通过 WebGL 的技术,只需要编写网页代码即可实现3D图像的展示.WebGL 可以为 Canvas 提供硬件3D加速渲 ...
- jquery css3问卷答题卡翻页动画效果
这个选项调查的特效以选项卡的形式,每答完一道题目自动切换到下一条,颇具特色.使用jQuery和CSS3,适合HTML5浏览器. 效果展示 http://hovertree.com/texiao/jqu ...
- 封装 用canvas绘制直线的函数--面向对象
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...