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# 文件下载之断点续传
注意,本文所说的断点续传特指 HTTP 协议中的断点续传.本文主要聊聊思路和关键代码,更多细节请参考本文附带的 demo. 工作原理 HTTP 协议中定义了一些请求/响应头,通过组合使用这些头信息.我 ...
- html+ccs3太阳系行星运转动画之土星有个环,地球有颗小卫星
在上一篇<html+ccs3太阳系行星运转动画>中实现了太阳系八大行星的基本运转动画. 太阳系又何止这些内容,为丰富一下动画,接下来增加“土星环”和“月球”来充盈太阳系动画. 下面是充盈后 ...
- intellij idea Jdk编译设置
Idea加载多项目时因为不同JDK,经常出现JDK编译版本的问题,容易出现以下异常. 一.异常信息: Information:Using javac 1.8.0_91 to compile java ...
- 多线程中的volatile和伪共享
伪共享 false sharing,顾名思义,“伪共享”就是“其实不是共享”.那什么是“共享”?多CPU同时访问同一块内存区域就是“共享”,就会产生冲突,需要控制协议来协调访问.会引起“共享”的最 ...
- PHP学习笔记:输入一句话,实现单词倒序输出
约定:句子以空格为词语分割符号,以句号为结束符号. 实现思路: 用函数explode(separator,string,limit)对字符串进行分割,再对得到的数据最后一个成员分割切掉符号.用一个新的 ...
- mysql主从之slave-skip-errors和sql_slave_skip_counter
一般来说,为了保险起见,在主从库维护中,有时候需要跳过某个无法执行的命令,需要在slave处于stop状态下,执行 set global sql_slave_skip_counter=1以跳过命令.但 ...
- php静态缓存简单制作
制作缓存的目的是为了让我们的页面运行更加快速,减少读取数据库内容的次数,给用户更好的体验,为此我们可以使自己的程序做一下缓存,并且设置一个缓存过期的时间,来保证与数据库的一致,当然并不是所有的程序都适 ...
- Jquery元素选取、常用方法
一:常用的选择器:(李昌辉) 基本选择器 $("#myDiv") //匹配唯一的具有此id值的元素 $("div") //匹配指定名称的所有元素 $(" ...
- Android 7.1 App Shortcuts使用
Android 7.1 App Shortcuts使用 Android 7.1已经发了预览版, 这里是API Overview: API overview. 其中App Shortcuts是新提供的一 ...
- C# 在Repeater 的ItemDataBound 如何转换e.Item.DataItem 的类型
1.使用DataSet和DataTable绑定数据源时,用 DataRowView view = (DataRowView)e.Item.DataItem; 2.DataReader绑定数据源时,用 ...