CS61C Lab 攻略:从入门到升天

CS61C Lab 攻略:从入门到升天

一、简介

CS61C 主要内容为计算机组成原理,重难点是实验(Lab)和项目(Project),当然课程的精华也是实验和项目。
本文是对 CS61C 的实验进行分析思考和总结,为项目做好铺垫。

二、Lab 0:整装待发

2.1 配置开发环境

git clone https://github.com/61c-teach/sp23-lab-starter/
cd sp23-lab-starter/lab0

首先是配置开发环境,我们不是 Berkeley 学生,很多环境是无法配置的,比如 gradescope 自动评分。
但课程代码全开源,我们只要把代码克隆下来,就能开始愉快地练习了。

2.2 小试牛刀

def fizzbuzz(num):
    if multiple of 15: # edit this line
    # print num: fizzbuzz
    elif multiple of 3: # edit this line
    # print num: fizz
    elif multiple of 5: # edit this line
    # print num: buzz

for i in range(1, 20):
  fizzbuzz(i)

课程提供了一个 Python 伪代码文件,修改它输出正确结果即通关,帮助大家快速上手。

def fizzbuzz(num):
    if num % 15 == 0:
        print(f"{num}: fizzbuzz")
    elif num % 3 == 0:
        print(f"{num}: fizz")
    elif num % 5 == 0:
        print(f"{num}: buzz")

for i in range(1, 20):
    fizzbuzz(i)

我们使用了取余运算符 % 来判断一个数字是否是另一个数字的倍数。

如果一个数字能被 3 和 5 同时整除(即能被 15 整除),则打印 “fizzbuzz”;

如果一个数字能被 3 整除,则打印 “fizz”;

如果一个数字能被 5 整除,则打印 “buzz”。

2.3 小结

至此,预热阶段正式结束,即将开启 C 语言大门。值得注意的是,CS61C 不会再练习 C 语言编程基础,而是深入到指针、内存等偏底层的技术中。

三、Lab 1:进击 C 语言

3.1 编译 hello world C

#include <stdio.h>

int main() {
  printf("Hello World\n");

  return 0;
}
cd lab01
gcc -o ex1 ex1_hello.c
./ex1

这串命令使用 gcc 编译运行了 C 代码,输出了"Hello World"。这里我们加入了一个 -o ex1 参数,表示输出文件名为 ex1 。./ex1 表示这执行这个程序。

我们平常大多用 IDE 去点击按钮编译运行,CS61C 却选择命令行编译运行,这主要是因为命令行占用资源少。

3.2 遇见指针

#include <stdio.h>

int main() {
  // Assign x (an integer) to 5
  int x = 5;

  // TODO: create a pointer to x
  // Hint: the first blank should be a variable type
  //       the second blank should be the address of x
  int* pointer_to_x = &x;

  // This line should print 5
  printf("%d\n", *pointer_to_x);

  return 0;
}

这段代码中要注意指针类型 int * 和取地址操作 &x 、和取值操作 *pointer_to_x

3.3 堆和栈上的指针

#include <stdio.h>
#include <stdlib.h>

int* int_on_stack() {
  // Allocates memory on the stack for an integer
  int x = 5;

  // Returns a pointer that points to the number 5
  return &x;
}

int* int_on_heap() {
  // TODO: allocate memory on the heap for an integer
  int* ptr_to_5 = malloc(sizeof(int));

  // TODO: store the number 5 in memory you just allocated
  *ptr_to_5 = 5;

  // Returns a pointer that points to the number 5
  return ptr_to_5;
}

int main() {
  int* ptr_to_stack = int_on_stack();
  int* ptr_to_heap = int_on_heap();

  printf("ptr_to_stack is the address %p\n", ptr_to_stack);
  printf("ptr_to_heap is the address %p\n", ptr_to_heap);

  return 0;
}

不难发现,栈上的指针不需要malloc申请空间,堆上的指针需要申请空间。

双重指针

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int id;
    char* name;
} Student;

Student* create_student_1(int id) {
  // TODO: allocate memory to store a Student struct
  Student* student_ptr = malloc(sizeof(Student));

  // TODO: set student_ptr's id to the id argument of this function
  student_ptr->id = id;

  return student_ptr;
}

void create_student_2(Student** student_double_ptr, int id) {
  // TODO: fill the space that student_double_ptr points to with the address of
  //       some memory large enough for a Student struct
  // Hint: you may need to use the dereference operator here
  *student_double_ptr = malloc(sizeof(Student));

  // TODO: set student_double_ptr's id to the id argument of this function
  (*student_double_ptr)->id=id;
}


int main() {
  // TODO: use create_student_1 to create a pointer to a Student struct
  //       where the student has id of 5
  Student* student1_ptr = create_student_1(5);

  // TODO: print the id of the student that student1_ptr points to
  printf("Student 1's ID: %d\n", student1_ptr->id);

  // TODO: create a pointer that can point to a Student struct
  //       do not allocate any memory
  Student* student2_ptr;

  // TODO: use create_student_2 to populate the student2_ptr
  //       where the student has id of 6
  // Hint: compare the type of student2_ptr with the type of
  //       the argument for create_student_2
  create_student_2(&student2_ptr, 6);

  // TODO: print the id of the student that student2_ptr points to
  printf("Student 2's ID: %d\n", student2_ptr->id);

  return 0;
}

双指针即指向指针的指针,可以直接改变原指针指向的数据结构。
为什么需要双重指针,我们来看一个例子。
程序1

void change(char* p)  
{
    p = "bbb";
}
int main(int argc, char* argv[])
{
    char *v = "aaa";
    change(v);
    printf("%s",v);
    return 0;
}

我们发现输出的结果仍然是aaa。

对它进行修改:

程序2

void change(char** p)
{
    *p = "bbb";
}
 
int main(int argc, char* argv[])
{
    char *v = "aaa";
    change(&v);
   printf("%s",v);    
   return 0;
}

此时输出的结果为bbb.

分析:
出现以上现象的原因是因为这个函数调用的时候,这个指针作为参数传递问题。程序1中,实际上,当我们调用函数change,把指针charv,当做参数传入的时候,这里还隐藏了一个赋值的操作,也就是说,传入到change函数中的是另外某个参数char x,x=v;所以说最后改变的只不过是x,v指向的东西并没有改变,所以输出来,还是aaa。如下图所示:

在这里插入图片描述

在程序2,操作过程中,指针v本身的地址值始终没有改变,改变的是指针v所指向的地址变化了。它不再指向”aaa”所在的地址,而是”bbb”所在的地址。如下图所示:
在这里插入图片描述

总结:
当指针作为函数参数传递的时候,如果想改变指针所指向的地址,比如想把char*v,从指向“aaa”转到指向“bbb”,那么需要采用双重指针传递的方式。或者说想通过调用函数的方式,给指针用malloc 分配新的地址的时候,也需要采用双重指针,才能实现真正的分配,否则是分配不成功的。

而如果只是想改变,指针所指向的地址里面的内容的时候,则采用单重指针就可以了,比如想把“aaa”改成“aab”,那么直接用单重指针传递就ok了,因为指针指向的地址不需要改变。代码就应该写成,如下:

程序3

void change(char* p)  
{
    *(p+2) = 'b';
}
int main(int argc, char* argv[])
{
    char *v = "aaa";
    change(v);
    printf("%s",v);
    return 0;
}

如下图:

在这里插入图片描述

热爱技术的小胡
关注 关注
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
CS401:从入门到 Java 课程的课堂作业
06-29
在“CS401:从入门到 Java 课程的课堂作业”中,我们可以深入学习 Java 编程语言,这是计算机科学领域中一个重要的编程工具,尤其对于初学者来说,Java 提供了良好的学习曲线和广泛的应用场景。这个作业集重点在于...
CS61C总结
doyouthinks的博客
06-01 956
CS 61C 课程名称是,毫无疑问核心内容就是这些 ideas,6 个 ideas 内容分别如下。
CS61C(su20) lab03
wys0304的博客
10-11 323
题外话:我网上查到说ecall的调用号应该在a7,但是这个代码里的调用号不知道为什么在a0,可能是cs61c自己开发的这个Venus模拟器的问题。这道题的代码写了两个版本,第一个版本是循环的写法,第二个版本是递归的写法。表示source的指针寄存器是s1,表示dest数组的指针寄存器是s2。loop和square中的代码汇编代码为c 中循环中的代码。表示变量k的寄存器应该是t0.表示变量k的寄存器应该是s0.通过地址寻址的方式来操作指针。
【UCB CS61C】Lecture 4 - C Memory Management & Usage
David Max 的博客
08-30 651
本文章系计算机体系结构课程 UCB CS61C: Great Ideas in Computer Architecture 的学习笔记。
CS61C 2020计算机组成原理Lab03
最新发布
weixin_47505105的博客
09-20 775
A: after “la t3, n” , t3这个地方变成了 268435464。gpt4的回答(更详细,举了例子,和我的答案是一样)完成factorial.s, 实现求阶乘的功能。Answer: s1 和 s2。Answer: 使用偏移。
探索计算机架构的基石:CS61C学习资源库
gitblog_00008的博客
06-03 410
探索计算机架构的基石:CS61C学习资源库 去发现同类优质开源项目:https://gitcode.com/ 在这个充满技术创新的时代,对计算机底层架构的理解是提升软件开发效率和优化系统性能的关键。这就是为什么我们强烈推荐CS61C,一个专注于“Great Ideas in Computer Architecture”的开放课程资源库。它将带你深入探索RISC-V指令集、CPU设计、缓存机制以及并...
CS61C 学习笔记 --实时更新
pursue_my_life的博客
09-23 8203
CS61c Note 第一周 计算机中数值的表示及其转换 Lecture Topic 分为两部分: 计算机历史即计算机组成介绍、 数值转换及其表示 Reading Section 四种表示法: Sign and … one’s complete basic two’s complete Lab 五个游戏,举例其中最有意思的两个: 给你1000个1的纸币,和10个信封,并把钱放到信封里...
CS61C学习 —— 第一课
w512的专栏
08-30 1970
目标 CS61C学习 —— 第一课 计算机处理器和内存是如何工作的? 处理器和内存是如何影响软件设计和性能的? 介绍计算机系统领域相关知识(CS 152, CS 164, CS 161, CS 149, CS 162, EECS 151等等): 架构 编译器 安全 嵌入式 操作系统 数字设计 … 软硬件接口 对于软件开发来说, 需要了解软件开发的工具 —— 计算机! 计算机有各种形状和大小 现代计算机技术以许多不同的方式实现 需要知道如何改善程序性能 并行技术 操作系统 + 计算
CS61C硬件和CPU设计部分笔记(个人记录向)
m0_74124277的博客
02-05 1102
逻辑电路部分已经在学校的课程学过了,这部分过的比较快。
CS61C学习 —— 第二课——数字表示法
w512的专栏
08-30 300
数据输入 模拟 -> 数字 真实的世界是模拟的, 为了获取到模拟信息,我们做如下两件事 采样(sample) 量化(Quantize) 原始的模拟信号 采样后的信号 量化后的信号 最终的离散数字信号
怎样学习数据结构? 伯克利神课CS61B 总结感悟,学习指南和避坑建议
热门推荐
lindaicoding的博客
08-06 1万+
目录 【概述】 【课程传送门】 【课程评价】 【课程版本选择】 【课程教材选择】 【课程难度与作业量】 【课程简介】 1)了解数据结构类型 2)根据场景应用数据结构 3)学习了Java这门语言 【如果时光倒流,我再次上这门课时我会注意什么?】 1.读英文原版教材。 2.注重课本,注重一手资料。 3.写作业,要多做题目。 4.坚持。 文章6900字,阅读时间约7分钟 【概述】 学习编程有两门基础课程,即数据结构和算法。数据结构中网络公开课中评价一直居高不下的就是U...
CS150:从我的入门到C ++课程
04-13
CS150 我正在使用Bazel来管理课程工作中固有的“子项目”结构。 目标清单: //week01-day1:helloworld //week01-day1:textbook-1-1 //week02-day1:interview //week02-day2:restaurantbill //week03-day1:...
CS_MoCo_LAB:压缩传感和运动校正LAB:MR采集和重建系统
02-03
2D +时间,3D,3D +时间):CS_FLASH(Siemens,VB20P) MR运动成像序列(4D,5D):CS_Retro(Siemens,VB20P,VE11C,VE11P)重建Gadgetron的CS和运动分解重建系统(C ++) Matlab中的CS重建系统(包括GUI)应用...
cs507s15lab5:lab5 的新存储库
06-23
【标题】"cs507s15lab5:lab5 的新存储库"提示我们这是一个与计算机科学课程相关的实验室工作,可能属于课程编号为cs507的2015春季学期的一部分。"lab5"表明这是该课程的第五个实验任务,通常在编程课程中,每个实验...
cs6312_lab10:排序算法
02-22
本实验包"cs6312_lab10"聚焦于排序算法的学习与实践,旨在帮助学生深入理解这些算法的工作原理及其实现方法。** 1. **排序算法的基本概念** - 排序是指将一组无序的数据元素按照特定的顺序排列的过程。 - 排序...
CS61C(su20) lab02
wys0304的博客
09-30 133
看makefile文件回答问题。
CS61C Spring 2021——Project 1: Philphix要求及实现思路
weixin_43405649的博客
09-22 704
它接受一个单一的命令行参数作为输入(包含将要使用的替换集的文件名),根据输入的信息选择对应的字符替换集合。集合由一系列单词对组成,每一对单词占据一行,一对单词之间由任意数量的tab/space分隔。如果输入的单词不匹配的话,原样print;如果单词匹配,print符合最高优先权的替换单词。第一个单词为待匹配单词,第二个单词为替换单词。2.单词首字母变为小写后和待匹配单词对应;3.单词转换为小写后和待匹配单词对应。1.单词恰好和待匹配单词对应;
CS61C lec04 笔记
weixin_72649286的博客
05-15 191
在大端字节序(big-endian)机器上,整数的最高字节被存储在最低的地址中,而最低字节被存储在最高的地址中。在小端字节序(little-endian)机器上,情况正好相反:整数的最低字节被存储在最低的地址中,而最高字节被存储在最高的地址中。如果新的大小大于原来的大小,则它将分配一个新的内存块,并复制旧的数据到新的内存块中,并且释放旧的内存块。需要注意的是,在使用字符串文字时,不能将其赋值给一个指向栈上分配内存的指针,因为栈上的内存在函数返回时会被释放,这会导致指针指向的内存区域无效。
cs61a lab05
07-27
回答: 你提到的引用内容包括三个部分。引用\[1\]是关于一个对象的打印效果的示例。引用\[2\]是一个关于存储数字的函数的示例,使用了链表的数据结构。引用\[3\]是关于一个Python实验室的问题。根据你的问题,我无法确定你具体想要了解关于cs61a lab05的什么内容。请提供更具体的问题,我将尽力回答。 #### 引用[.reference_title] - *1* [【CS61A】学习笔记](https://blog.csdn.net/cpp_juruo/article/details/126575901)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [CS61A Lab 7](https://blog.csdn.net/MINGgoS/article/details/128358493)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
写文章

分类专栏

  • Spring 项目实战 甄选 付费 5篇
  • 华为OD机试2024题库c++ 2篇
  • 鸿蒙 HarmonyOS 精粹 6篇
  • Linux 系统吐血总结 3篇
  • flask 1篇

最新评论

  • CS61C Lab 攻略:从入门到升天

    jim_parkle: 为什么只写了一个lab表情包

  • SpringBoot + Vue 抖音全平台项目

    一席嗔梦: 有教学视频么,可以出吗

  • SpringBoot + Vue 抖音全平台项目

    cellllec: 有人运行过了吗?为什么视频发布后播不了,报错空指针异常

  • 借助AI,直接刷真题也能通关软考

    2301_82243232: 好文,细节很到位!【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • 解决 Access denied for user `root`@`localhost`

    普通网友: 干货满满!我也写了一篇获取【大厂面试真题解析、核心开发学习笔记、最新全套讲解视频、实战项目源码讲义、学习路线简历模板】的文章

最新文章

  • GPT4o 大战高考数学, 惨败
  • 倒排文件的设计与实现
  • Devin AI程序员是如何设计出来的
2024年19篇
2023年28篇
2022年5篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱技术的小胡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家大理市玻璃钢雕塑报价天津环保玻璃钢雕塑订做价格泰州玻璃钢广场雕塑厂家江苏小品系列玻璃钢雕塑生产厂家陈翔六点半球球商场试衣美炸了葫芦岛卡通玻璃钢雕塑玻璃钢罗马雕塑玻璃钢人像雕塑公司哪家好昆明个性化玻璃钢雕塑安阳镜面不锈钢玻璃钢雕塑厂家亳州玻璃钢雕塑价钱兰州人物玻璃钢雕塑安装临沂玻璃钢雕塑制作厂家甘肃中高端玻璃钢雕塑厂家厦门玻璃钢雕塑定制毕节玻璃钢商场美陈铁岭景区玻璃钢雕塑定做玻璃钢彩绘雕塑图片创新型的玻璃钢雕塑厂呈贡玻璃钢大型雕塑设计哪家专业河西玻璃钢动物雕塑安阳哪里有玻璃钢彩绘雕塑上海仿铜玻璃钢雕塑定制玻璃钢雕塑业绩表西安玻璃钢公园雕塑日照玻璃钢雕塑制作江苏天筑玻璃钢雕塑厂家江西佛像玻璃钢雕塑销售厂家仿真玻璃钢雕塑鲨鱼福建常用商场美陈香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化