2023,我与C/C++相遇的奇迹之年

简介: 2023,我与C/C++相遇的奇迹之年

一、C语言

C语言真的算是我编程之路一切一切的起点了,从6月高考完,那个暑假没有想象中的吃喝玩乐,而是早睡早起地学习C语言,练习打代码,踏上我的编程之路的第一步。一开始在b站听鹏哥的网课,真的受益匪浅,鹏哥真的算是我计算机的引路人,讲课真的通俗易懂,一下子就点燃了学习的火苗,我真的哭死……

下面我想分享一下令我印象深刻的事情或者知识点。

1.1 写博客

学计算机,一定要学会写博客,整理自己的思路,也方便别人学习模仿。

还记得我在CSDN写下第一篇博客之时,不知道怎么布局文章,也不知道怎么排版,导致排版很丑,思路稀烂,但至少我勇敢地踏出了这一步!

要写出高质量的博客还是要花费一番心思的,可能两三天才能完成一篇博客,但不用怕久,那都是你思想的结晶,将来的你一定会感谢写在认真写博客的自己。

1.2 上传git

每天写的代码按时上传gitee(或者github),保持这样的习惯,方便以后自己或者别人了解你的代码量和成长经历。

最好分类建立仓库,时常维护你的git,那就像是程序员的朋友圈,记录每天遇到或写下的好代码。

1.3 三子棋和扫雷

学习完数据类型与变量、分支与循环、数组、函数章节,我在鹏哥的指引下成功做出第一款像模像样的小游戏——三子棋。虽然页面很简陋,玩法和规则很简单,但我知道,那是独属于我的成功。

后续类似的经验,又成功写出来最为经典的小游戏之一——扫雷,那可把我给开心坏了,我仿佛是我自己小世界里的英雄,无所不能。在学习完函数递归的知识,我又成功的优化了扫雷的自动展开空白的功能,为其添上了浓墨重彩的一笔。

扫雷游戏(数组与函数实现)

1.4 精妙的机关术——位操作

在了解计算机中原码、反码、补码的存在,我不得不佩服当初设计这种存储模式的人的天赋异禀,原码和补码经过相同操作居然能相互转换?!

在位操作符中,令我印象最深的便是^异或,简简单单一句,相同为0,相异为1,包含了多少精妙绝伦的思想在里面。在看到利用异或完成两个变量的互换时,我整个人都惊呆了,妙,妙,实在是太妙了!

a = a ^ b;
b = a ^ b;
a = a ^ b;

(二进制)操作符详解

1.5 C语言的利剑——指针

说起指针,可能很多学习C语言的同学头都大了,一级二级指针,数组名,数组指针,函数指针……其实,指针也并没有想象中的那么难,我在学习的时候,记清楚关键要点,也就可以正确地使用这把利剑,大杀四方!

正是拥有了指针,C语言才能自由地访问和操作内存,缔造出属于自己的世界。就如同仙侠小说中的飞剑术一般,万里之外取敌人首级,千里寻踪。

不允许你还不了解指针的那些事(一)

不允许你还不了解指针的那些事(二)

1.6 C语言的铠甲——结构体

将多种内置类型熔铸在一起,打造专属于你的铠甲,它有着更为强大的信息存储功能,能够描绘更加复杂的对象。

不过,作为打造它的匠师,你需要了解它的比例配方(内存对齐)、使用方法(结构体访问)、特殊技巧(位段)等

自定义类型:结构体(你真的掌握了内存对齐,位段吗?)

1.7 C语言的内功心法——动态内存管理

说到内存,那可就是咱们程序员的法力源泉了。一个内功深厚的程序员,一定是会正确高效使用内存空间的,就如同拥有顶级的内功心法,能够随心所欲地汲取法力,操纵并运用,威力无穷。

C语言中广泛流传天下的基础心法——malloc/free,被一代又一代程序员学习,不同的人运用出来的效果也大相径庭,有人可以一剑开天门,有人却练得走火入魔。

【C语言】动态内存管理(C语言的难点与精华,数据结构的前置知识,你真的掌握了吗?)

二、初阶数据结构

在C语言学完后,我带着虔诚的心,叩开了数据结构的大门。我仿佛打开了一扇新世界的窗,那里的一切都令我深深着迷。在这里,我才发现C语言只是一种手段来辅助自己,而数据结构里的思想才是我真正要学习的精华所在。

2.1 画图,一定要画图!

数据结构学习的阶段,一定要动手画图,千万不要凭空想象,相信我,这会让你将来受益无穷。

本来一个问题,画图10分钟能解决,结果硬是盯着屏幕看了半个小时都没有思路,都是血与泪的教训……

2.2 顺序表

由数组升级而来的顺序表,首先映入眼帘,用函数来操作封装后的动态数组,实现增删查改,这一切仿佛既熟悉又陌生,熟悉的是对数组操作,不熟悉的是以这样新奇的方式进行。

如何进行定义,如何实现功能,之前C语言学习的知识大展拳脚,有力地帮助我学习的高效进行。

【数据结构】【版本1.0】【线性时代】——顺序初现

2.3 链表

这几乎像是一个全新的领域,从未接触过的链式结构,指针在链表里就像一个英雄。指针指向的不断改变,还时常伴随着NULL的突然出现,确实让我很长一段时间摸不着头脑。

但是,经过大量的刷题和总结,终于还是将其驯服成功。

链表三板斧:

  1. 哨兵位
  2. 快慢指针
  3. 多设置指针变量(千万别省变量!)

【数据结构】【版本1.1】【线性时代】——链式之力

【数据结构】【版本1.2】【线性时代】——链表之王(双向带头循环)

2.4 栈和队列

栈和队列其实只是满足特定需求的线性表,底层实现还是使用顺序表和链表。但是一般栈用顺序表实现,队列用链表实现会比较方便。

开玩笑地说,栈是最不公平的,因为后进先出,而队列是最公平的,因为先进先出

【数据结构】【版本1.3】【线性时代】——地下栈域

【数据结构】【版本1.4】【线性时代】——公平队列

2.5 二叉树

这又是一个全新的概念——树形结构,和之前讲的线性结构又不相同了。不知道多少学习数据结构的同学,对“树”又头疼不已。而二叉树,就是一种特殊的树,更是无数同学的噩梦呢(哈哈哈~)

二叉树又分为堆(顺序表实现)和链式二叉树(链表实现),所以平常说的二叉树其实就是链式二叉树啦。二叉树其实就是不断玩递归,而递归一般分为两步:

  1. 终止条件
  2. 子问题

【数据结构】【版本2.0】【树形深渊】——二叉树入侵

当然,后续二叉树还有进阶(这部分用C++比较好实现,所以在C++学习):

二叉树

二叉搜索树

AVL树

红黑树

2.6 排序

大人一桌:希尔排序、堆排序、快速排序、归并排序

小孩一桌:插入排序、选择排序、冒泡排序

这里计数排序有些飘忽不定,有时候在大人那桌最能喝,能把其他排序都干趴下,有时又只能在小孩那桌玩泥巴。

哈哈哈,上面是形象地开个玩笑,总体来说,排序是一种算法思想,学习它的过程中能有效锻炼自己的逻辑思维能力,以后再也不用担心不会排序啦!

【算法】七大经典排序(插入,选择,冒泡,希尔,堆,快速,归并)

三、C++

终于,最后的最后,穿过山川和人海,经历了C和数据结构,我还是与你相见——C++。此刻,眼中仿佛有激动的泪光,一切的一切都是值得的,这是一个全新的起点,亦是通天大道之始。

3.1 从namespace开始的C++生活

相信不少学C++的小伙伴,都是从这里入坑的吧。C++练级之路从此开始,缺省参数、函数重载、引用、内联函数等引入,对原本C缔造的世界带来了翻天覆地的变化,填补C语言的不足,增加便利。

C++11引入auto,范围for,nullptr,进一步增加简便的语法,体验感直接爆棚。

3.2 C++的机甲——类

C++是面向对象编程的语言,而C是面向过程编程。所以C++就引入了类的概念,其实类是结构体的升级版,集变量与函数于一身,从铠甲变成了机甲,从此我们只要设计好类,就可以操纵它大杀四方了!

同样,作为机甲设计师,你要完全发挥出它的性能,就必须了解其内部构造,例如类的定义,访问限定符,this指针等。在了解完基础部分,就必须掌握最为重要的部分——类的默认成员函数,这样你才能在不同场景根据需求进行不同的设计,使你的与机甲的同步率达到1000%哦~

3.3 C++的动态内存管理——new/delete

针对类和对象,C++推出了自己的动态内存管理的方式,可以在开辟空间时对类调用相应的默认成员函数,进行初始化和销毁。

其实,new和delete的底层也用到了malloc和free,只不过对它们进行了封装。另外,new写起来也真的更加简便,不用强转类型,因为C++会自动识别类型哦,相信我,使用new后,你会发自心底地爱上它的!

3.4 C++的终极杀器——STL

为什么说它是大杀器呢?因为你在刷题时会有明显感觉,在做数据结构的某些题目,比如需要一个栈,而C语言并没有现成的库,需要手动造轮子,但是,C++有现成的库,直接调用就行!你根本想不到这对一个刷题的人是一种多大的诱惑,终于不用每次拷贝写了上百行代码的栈,而是可以直接使用了啊啊啊……

目前还在继续学习,刚刚学了string类,居然有100多个接口,真是不要太复杂冗余!幸好常用的不多,剩下的就等着以后有需要时查文档咯~


结语与祝福

记录一下我踏入计算机世界的起始年,分享一路上的感悟与酸甜苦辣,这一路有志同道合的伙伴同行,留下了太多的美好,我很珍惜。2023,我与C/C++相遇的奇迹之年就此落下帷幕,而希望,仍在远方眺望。

最后,提前祝福大家新年快乐啦,新的一年写代码没有bug,写题目秒出思路哦!


真诚点赞,手有余香


相关文章
|
6月前
|
编译器 Linux C语言
我的C++奇迹之旅相遇:支持函数重载的原理
我的C++奇迹之旅相遇:支持函数重载的原理
|
6月前
|
存储 分布式计算 安全
我的C++奇迹之旅:值和引用的本质效率与性能比较2
我的C++奇迹之旅:值和引用的本质效率与性能比较
|
6月前
|
编译器 C++
我的C++奇迹之旅:值和引用的本质效率与性能比较1
我的C++奇迹之旅:值和引用的本质效率与性能比较
|
6月前
|
存储 编译器 C语言
我的C++奇迹之旅:内联函数和auto关键推导和指针空值
我的C++奇迹之旅:内联函数和auto关键推导和指针空值
|
6月前
|
编译器 C语言 C++
【C++的奇迹之旅(二)】C++关键字&&命名空间使用的三种方式&&C++输入&输出&&命名空间std的使用惯例
【C++的奇迹之旅(二)】C++关键字&&命名空间使用的三种方式&&C++输入&输出&&命名空间std的使用惯例
|
6月前
|
自然语言处理 编译器 C语言
C++奇迹之旅(三):缺省参数与函数重载
C++奇迹之旅(三):缺省参数与函数重载
|
11月前
|
人工智能 算法 BI
C++二分查找算法:找到 Alice 和 Bob 可以相遇的建筑
C++二分查找算法:找到 Alice 和 Bob 可以相遇的建筑
|
C++ 流计算
ASCII码模拟星系碰撞:牛顿引力定律融合C++的「奇迹」
继上次用SCII实现曾经「专属」Nvidia的光线追踪技术之后,作者又使用ASCII模拟了碰撞的星系,过程十分逼真。此外,他还发布了ASCII游戏、ASCII模仿鱼群等项目,心动了么?还不赶紧上手试试!
159 0
ASCII码模拟星系碰撞:牛顿引力定律融合C++的「奇迹」
|
6天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
29 4
|
7天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
25 4