作业总结

两次的作业,都是和指针有关。从第一次的作业开始,我就多次让同学们思考这个问题:为什么要用指针,为什么在函数的形参中要使用指针。如果能够想明白这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);

在这里,对函数传入参数ab,和后面的注释中那样传递入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语言学习 第十一次作业总结的更多相关文章

  1. C语言学习 第七次作业总结

    C语言学习 第七次作业总结 数组可以分为数组和多下标数组(在传统的国内C语言书本中,将其称为二/多维数组). 数组名称 在之前的课程中,大家应该都有印象,对于int a这样的定义,会为变量 a 声明一 ...

  2. Go语言学习笔记十一: 切片(slice)

    Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用.不像java语言写起来就比较繁琐.不过我觉得未来java语法也会支持的. 定义切片 ...

  3. C语言学习 第八次作业总结

    本次作业其实没有新的内容,主要就是复习上一次的一维数组的相关内容.冯老师布置了5道题目,其中涉及到一些比较简单的排序或者是查找的方法.因为数据很少,所以直接使用for循环遍历就可以了. 关于本次作业, ...

  4. C 语言学习 第三次作业总结

    本次作业内容: For循环的使用 If判断语句的使用 常用数学运算表达式的使用 数学函数库中几个常见函数的使用及自我实现 将操作代码提交到coding 作业总结: For循环是C语言中一种基本的循环语 ...

  5. C 语言学习 第12次作业总结

    作业总结 本次课堂的内容为字符串相关的几个函数还有结构体. 字符串相关函数 在此之前的课程中,输入主要都是使用scanf这个函数.而在这节课上,冯老师讲解了字符串获取函数gets.在不需要控制符的情况 ...

  6. C 语言学习 第六次作业总结

    本次作业,同学们开始学习函数.通过之前和同学们的沟通,似乎同学们在这里遇到的问题比较多.下面,我先帮同学们整理下函数的相关知识点. 什么是函数 首先,需要明确的是,什么是函数.所谓函数,也就是一段有名 ...

  7. C语言程序设计第十一次作业

    同学们,一晃一个学期就过去了,第一节课时,我曾做过一个调查,没有一个同学在中学阶段接触过程序设计,也就是说,那时,大家都是零基础,或许只是听说过"C语言"这个词,但其他便一无所知了 ...

  8. C 语言学习 第五次作业总结

    第五次作业,主要学习和复习的是几种循环结构的使用. 在前一次的课堂上,同学们已经学习了分支语句的使用.分支语句和循环语句配合使用,就可以写出更多的,逻辑功能丰富的代码了. 逻辑功能的丰富,也意味着学习 ...

  9. C语言学习 第四次作业总结

    本次作业主要为了复习分支语句,同时复习之前学习过的判断语句,printf和scanf函数的使用. 学习到这里,同学们应该已经基本掌握了基本的数据类型,分支结构,循环结构,条件判断语句.应该可以利用这些 ...

随机推荐

  1. C# 文件下载之断点续传

    注意,本文所说的断点续传特指 HTTP 协议中的断点续传.本文主要聊聊思路和关键代码,更多细节请参考本文附带的 demo. 工作原理 HTTP 协议中定义了一些请求/响应头,通过组合使用这些头信息.我 ...

  2. html+ccs3太阳系行星运转动画之土星有个环,地球有颗小卫星

    在上一篇<html+ccs3太阳系行星运转动画>中实现了太阳系八大行星的基本运转动画. 太阳系又何止这些内容,为丰富一下动画,接下来增加“土星环”和“月球”来充盈太阳系动画. 下面是充盈后 ...

  3. intellij idea Jdk编译设置

    Idea加载多项目时因为不同JDK,经常出现JDK编译版本的问题,容易出现以下异常. 一.异常信息: Information:Using javac 1.8.0_91 to compile java ...

  4. 多线程中的volatile和伪共享

      伪共享 false sharing,顾名思义,“伪共享”就是“其实不是共享”.那什么是“共享”?多CPU同时访问同一块内存区域就是“共享”,就会产生冲突,需要控制协议来协调访问.会引起“共享”的最 ...

  5. PHP学习笔记:输入一句话,实现单词倒序输出

    约定:句子以空格为词语分割符号,以句号为结束符号. 实现思路: 用函数explode(separator,string,limit)对字符串进行分割,再对得到的数据最后一个成员分割切掉符号.用一个新的 ...

  6. mysql主从之slave-skip-errors和sql_slave_skip_counter

    一般来说,为了保险起见,在主从库维护中,有时候需要跳过某个无法执行的命令,需要在slave处于stop状态下,执行 set global sql_slave_skip_counter=1以跳过命令.但 ...

  7. php静态缓存简单制作

    制作缓存的目的是为了让我们的页面运行更加快速,减少读取数据库内容的次数,给用户更好的体验,为此我们可以使自己的程序做一下缓存,并且设置一个缓存过期的时间,来保证与数据库的一致,当然并不是所有的程序都适 ...

  8. Jquery元素选取、常用方法

    一:常用的选择器:(李昌辉) 基本选择器 $("#myDiv") //匹配唯一的具有此id值的元素 $("div") //匹配指定名称的所有元素 $(" ...

  9. Android 7.1 App Shortcuts使用

    Android 7.1 App Shortcuts使用 Android 7.1已经发了预览版, 这里是API Overview: API overview. 其中App Shortcuts是新提供的一 ...

  10. C# 在Repeater 的ItemDataBound 如何转换e.Item.DataItem 的类型

    1.使用DataSet和DataTable绑定数据源时,用 DataRowView view = (DataRowView)e.Item.DataItem; 2.DataReader绑定数据源时,用 ...