关于我、重生到500年前凭借C语言改变世界科技vlog.16——万字详解指针概念及技巧
sizeof 和 strlensizeof在初学C语言时就提到过 sizeof 的概念,这也是个常用的关键字,想必已经大家已经烂熟于心回顾提示:sizeof(类型)、sizeof 表达式 sizeof 是操作符 sizeof 计算操作数所占内存的大小,单位是字节 不关注内存中存放什么数据 这里不做过多赘述,忘记的可以去看我往期的文章回顾: 传送门:关于我、重生到500年前凭借C语言改变世界科技vlog.2——C语言数据类型和变量 strlen前面在举指针的例子的时候,提到过 strlen ,是用来计算字符串长度的 传送门:strlen-C++参考 头文件为 #include <string.h> , strlen 是专门用于计算字符串长度的,strlen 从 str 这个参数的地址开始向后,统计 \0 之前的字符串个数,只要没遇到 \0 就不会停止,直到找到为止,所以可能存在越界查找的情况 通过一个例子就能明白: 123456789101112#include <stdio.h>int main(){ char arr1[3]...
关于我、重生到500年前凭借C语言改变世界科技vlog.15——深入理解指针(4)
回调函数的介绍 回调函数就是一个通过函数指针调用的函数 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数 正如我们在上一篇 vlog 中讲到的转移表,就是经典的回调函数,回调函数不是函数本身自己实现的,而是在特定的事件或条件发生的时候由另一方调用,对该事件或条件进行响应 传送门:关于我、重生到500年前凭借C语言改变世界科技vlog.14——常见C语言算法 还是以一个简易的计算器做例子 每写一个计算方法都要写一种情况,不断地 scanf 输入,printf 输出,显得过于啰嗦 把每种情况的函数统一由一个函数管理,把这些函数以参数的形式传给该函数,这些函数就被称为回调函数 值得注意的是,在上一篇 vlog...
关于我、重生到500年前凭借C语言改变世界科技vlog.14——常见C语言算法
冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的走访操作,直到没有要交换的数据元素为止 核心思想:==两两元素进行比较交换== 基本原理1.比较相邻的元素,如果第一个比第二个大(假设是按照升序排序,若为降序则相反),就交换它们两个2.对每一对相邻元素作同样的操作,从开始第一对到结尾的最后一对,这样在经过第一轮比较后,最大的元素就会 “浮” 到数列的末尾3.针对所有的元素重复以上的步骤,除了最后已经排好序的元素(因为每一轮都会把当前未排序部分的最大元素移到最后,所以每轮结束后末尾的元素数量会增加,这些元素就不需要再参与后续排序了)4.持续重复上述过程,直到整个数列都按照要求的顺序排列好 理论知识介绍完,举个例子或许你就完全明白了假设我们有一个数组 [5, 4, 3, 2, 1] 要进行升序排序: 第一轮排序1.比较第 1 个元素 5 和第 2 个元素 4,因为 5 > 4,所以交换它们,数组变为 [4, 5, 3, 2,...
关于我、重生到500年前凭借C语言改变世界科技vlog.13——深入理解指针(3)
字符指针变量字符指针变量,顾名思义就是字符类型的指针,即 char*常见的输出格式是这样的: 1234567int main(){ char ch = 'w'; char *pc = &ch; *pc = 'w'; return 0;} 这是存放一个字符的情况,如果存放字符串呢? 123456int main(){ const char* pstr = "hello bit."; printf("%s\n", pstr); return 0;} 乍一看是存放字符串在指针变量中,但我们要记住指针变量是用来存放地址的所以这里本质是把字符串 hello bit. 首字符的地址放到了pstr中,即字符 h 的地址 数组指针变量上一篇 vlog 学到了指针数组,就是存放指针的数组,也可以理解为存放指针的集合(元素相同),那么数组指针就可以得出是存放数组地址的指针,是一种指针变量,指向数组 12int *p1[10];int...
关于我、重生到500年前凭借C语言改变世界科技vlog.12——深入理解指针(2)
数组名与地址有这么一个数组,数组名为 arr 12int arr[10] = {1,2,3,4,5,6,7,8,9}int *p = &arr[0] 在这里 &arr[0] 指的是首元素地址,其实本质上数组名就代表的是数组首元素地址接下来我们将对以下几个名字进行区分 1.arr2.sizeof(arr)3.&arr arr12345678#include <stdio.h>int main(){ int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; printf("&arr[0] = %p\n", &arr[0]); printf("arr = %p\n", arr); return 0;} 根据以上保留取地址符&和只用数组名,打印对应的地址可以发现两个的地址都相同,这就说明了 &arr[0] =...
关于我、重生到500年前凭借C语言改变世界科技vlog.11——深入理解指针(1)
内存和地址 内存是用于暂时存储 CPU(中央处理器)正在处理的数据以及与硬盘等外部存储设备交换的数据的硬件设备。它充当了 CPU 和其他设备之间数据传输的中转站,使得计算机各个部件能够高效协同工作 我们在买电脑时,有 8GB/16GB/32GB等内存选择,读取数据和处理后的放回数据都是经过内存处理的,读取数据和放回数据也要找到相应的地址放回,电脑也像人一样,要进行高效的内存空间管理,所以电脑把每一个字节的空间作为一个内存单元 每个内存单元,就好比一间间酒店房间,每个房间能住 8 个比特位,房间(内存单元)都有一个门牌编号(地址),有了门牌号,就能快速找到相应的房间,即CPU能通过地址快速找到内存空间,在C语言中,给地址起了个名字叫指针 内存单元编号=地址=指针 CPU访问内存中的某个字节空间,必须知道这个字节空间在内存的什么位置,而因为内存中字节很多,所以需要给内存进行编址,计算机中的编址,并不是把每个字节的地址记录下来,而是通过硬件设计完成的,在硬件层面上就设计好了 指针变量 int a = 5int * p...
关于我、重生到500年前凭借C语言改变世界科技vlog.10——进制转化&&操作符进阶
操作符分类 • 算术操作符:+ 、- 、* 、/ 、%• 移位操作符:<<、>>• 位操作符:&、|、^• 赋值操作符:=、+=、-=、*=、/=、%=、<<=、>>=、&=、|=、^=• 单目操作符:!、++、–、&、* 、+ 、- 、~ 、sizeof、(类型)• 关系操作符:>、>=、<、<=、==、!=• 逻辑操作符:&&、||• 条件操作符:?:• 逗号表达式:,• 下标引用:[ ]• 函数调用:( )• 结构体成员访问:....
关于我、重生到500年前凭借C语言改变世界科技vlog.9——青蛙跳台阶、汉诺塔
青蛙跳台阶专题 题目介绍: 一共有 n 阶台阶,有一只青蛙能向上跳一阶台阶或两阶台阶问:当青蛙跳到第n阶台阶时,有多少种跳法? 这个问题乍一看有些摸不着头脑,我们可以通过举例的方式来找到问题的规律这里我们设青蛙跳上第 n 阶台阶有 Fib(n) 种方法 n = 1 时,青蛙跳上第 1 阶台阶的方法:1 种n = 2 时,青蛙跳上第 2 阶台阶的方法:2 种n = 3 时,青蛙跳上第 3 阶台阶的方法:3 种n = 4 时,青蛙跳上第 4 阶台阶的方法:5 种……n = n-1 时,青蛙跳上第 n-1 阶台阶的方法:Fib(n-2)+Fib(n-3) 种n = n 时,青蛙跳上第 n 阶台阶的方法:Fib(n-1)+Fib(n-2) 种 观察可得,本质上青蛙跳台阶问题实质上就是一个斐波那契数列那么根据 vlog.8 中的斐波那契数列求和代码可以很容易写出解决方法: 1234567891011121314151617181920212223#define _CRT_SECURE_NO_WARNINGS...
关于我、重生到500年前凭借C语言改变世界科技vlog.8——函数递归
递归的介绍在 vlog.2 的 printf 函数的返回值举例中,我们使用多次递归的方式实现了同一个函数的返回值调用,但这只是一个简易的递归,不算真正意义上的递归,那么什么是递归? 在C语言中,递归就是函数自己调用自己,如果函数的递归没有限制条件,一直无限循环调用下去,代码最终就会陷入死循环,导致栈溢出(Stack overflow) 递归就是递推的意思,递归的思考方式就是将大事化小,将复杂的程序化成简单的代码格式,也就是化成一个个子问题求解,知道子程序不再被分解,递归就结束了 递归的限制条件值得注意的是,递归也存在限制条件 • 递归存在限制条件,当满足这个限制条件的时候,递归便不再继续• 每次递归调用之后越来越接近这个限制条件 递归实战应用求 n 的阶乘 由数学知识可知:n!= n ∗ (n−1)! 当 n == 0 的时候,此时 n 的阶乘是 1 ,n > 0时阶乘可根据公式计算 那么我们可以写出阶乘函数 Fact ,Fact(n) 是求 n 的阶乘,那么Fact(n-1)就是求 n-1 的阶乘此处不考虑 n...
关于我、重生到500年前凭借C语言改变世界科技vlog.7——数组函数实践
扫雷游戏专题 掌握了前面的数组与函数的知识,我们可以制作一款大多电脑上都有的简易版经典小游戏——扫雷游戏要求:1.游戏使用菜单可以选择继续游玩或退出游戏2.扫雷为 9 * 9 格子的棋盘3.默认随机布置 10 个雷4.排查雷:如果该位置不是雷,就显示周围有几个雷如果该位置是雷,就炸死游戏结束把除 10 个雷以外的空格都找出来就算游戏胜利 扫雷游戏的设计分析棋盘在扫雷过程中,布置的雷和排查出的雷的信息要分别存储在两个棋盘上因为我们需要在99的棋盘上布置雷的信息和排查雷,我们首先想到的就是创建⼀个99的数组来存放信息如果这个位置是雷,我们就存放字 1 ,不是雷就存放 ...