3.9k 4 分钟

该系列为本人的学习笔记,主要由本人整理书写而成。部分内容来自教材、视频课程等,不能保证完全原创性。 萌新的学习笔记,写错了恳请斧正。 # 大小端字节序 # 什么是大小端 首先,我们要知道,整数(short、int、long、long long)在内存中以补码的形式存储,无符号整数(unsigned)在内存中以原始二进制序列存储。 当数据长度小于等于一个字节时 ,很显然计算机就直接存储在一个字节内(内存存储的基本单元是字节)。而大小端字节序,则是超过一个字节的数据在内存中存储的两种方式。 为了更清楚的理解大小端字节序,下面我们创建一个变量 a: #include...
2.7k 2 分钟

该系列为本人的学习笔记,主要由本人整理书写而成。部分内容来自教材、视频课程等,不能保证完全原创性。 萌新的学习笔记,写错了恳请斧正。 在 string.h 头文件中有一些用于内存操作的函数 # memcpy #include <string.h>void* memcpy(void* dest, const void* src, size_t n);memcpy 是内存层面的复制,也即把一节内存的内容拷贝到另外一个位置 memcpy 从 src 指向的位置开始向后复制 n 个字节的数据到 dest 所指向的内存位置,并返回 dest 开始指向的位置 注意: 与...
4.2k 4 分钟

该系列为本人的学习笔记,主要由本人整理书写而成。部分内容来自教材、视频课程等,不能保证完全原创性。 萌新的学习笔记,写错了恳请斧正。 # 字符分类函数 在 ctype.h 头文件中有一些用于字符分类的函数,用于判断字符属于哪种类型 其中常见的有: iscntrl: 任意控制字符 isspace: 空白字符:空格、换页 (\f)、换行 (\n)、回车 (\t、制表符 \ t\v isdigit: 十进制数字 0~9 isxdigit: 十六进制数字 09、af、A~F islower: 小写字母 a~z isupper: 大写字母...
5.5k 5 分钟

该系列为本人的学习笔记,主要由本人整理书写而成。部分内容来自教材、视频课程等,不能保证完全原创性。 萌新的学习笔记,写错了恳请斧正。 # 回调函数 当一个函数 a 的参数含有函数指针时,这个函数指针在使用时所指向的函数 b(被该函数调用的函数)就是回调函数。注意回调函数并不是由函数 a 决定调用的函数,而是在调用函数 a 时决定使用的函数。 比方说,上一篇笔记中的计算器如果不用转移表实现,也可以这样: #include <stdio.h> int add(int a, int b){ return a + b;}int sub(int...
2.8k 3 分钟

该系列为本人的学习笔记,主要由本人整理书写而成。部分内容来自教材、视频课程等,不能保证完全原创性。 萌新的学习笔记,写错了恳请斧正。 # 函数指针 函数指针,顾名思义,就是存放函数地址的指针 # 函数的地址 函数也有地址吗?我们来看一段代码: #include <stdio.h> void func(){ ;} int main(){ printf(" func = %p\n", func ); printf("&func = %p\n",...
2.7k 2 分钟

该系列为本人的学习笔记,主要由本人整理书写而成。部分内容来自教材、视频课程等,不能保证完全原创性。 萌新的学习笔记,写错了恳请斧正。 # 指针数组 整型数组存放整型,那么指针数组自然是存放指针的数组。 要定义一个指针数组,我们应该像这样写: int* parr[3] = { pa, pb, pc }; 因为方括号的优先级要高于解引用操作符,所以 parr 先与方括号结合,规定其为数组。其中存储的数据类型为 int*(整型指针)。 # 指针模拟二维数组 #include <stdio.h>int main(){ int...
2.3k 2 分钟

该系列为本人的学习笔记,主要由本人整理书写而成。部分内容来自教材、视频课程等,不能保证完全原创性。 萌新的学习笔记,写错了恳请斧正。 # 数组名的理解 数组名其实就是数组首元素的地址,只有两个例外 (马上讲) 我们不妨写一个程序验证一下: #include <stdio.h> int main(){ int arr[10] = { 0 }; printf("%p\n", &arr[0]); printf("%p\n", arr); return...
1k 1 分钟

该系列为本人的学习笔记,主要由本人整理书写而成。部分内容来自教材、视频课程等,不能保证完全原创性。 萌新的学习笔记,写错了恳请斧正。 # 传址调用与传址调用 传值调用就是指函数的参数为一个值,是把变量的值传递给了函数 在传值调用时,原变量不会受到函数的影响,因为传递时创建了形参 形参是实参的一份临时拷贝,参与到函数的运算中,而实参不受影响 传址调用则是将一个指针 (地址) 传递给函数参与运算 而这是,函数可以通过指针来找到实参的位置并加以修改 因此,传值调用可以对原变量产生影响 例如,我们可以利用传址调用来写一个交换两个变量的函数: void Swap(int* p1, int*...
5.8k 5 分钟

该系列为本人的学习笔记,主要由本人整理书写而成。部分内容来自教材、视频课程等,不能保证完全原创性。 萌新的学习笔记,写错了恳请斧正。 # 指针是什么 # 内存与地址 CPU 在处理数据时,需要的数据在内存中存储,那么 CPU 是如何在内存中高速的读取数据的呢?难道是把内存的每一个位置都接一根线到 CPU 上单独控制吗?那显然很扯。其实,CPU 是通过有限的几根地址总线来访问特定的内存空间的。每一小片内存 (一个字节大小) 都有自己的地址,相当于 “门牌号”, 而地址总线传送的就是这个 “门牌号”。 在 32 位系统 (x86 系统属于 32 位系统) 中,每一个地址由 32...
5.7k 5 分钟

该系列为本人的学习笔记,主要由本人整理书写而成。部分内容来自教材、视频课程等,不能保证完全原创性。 萌新的学习笔记,写错了恳请斧正。 # 函数栈帧是什么 函数栈帧 (stack frame) 就是函数调用过程中在程序的调用栈 (call stack) 所开的空间,这些空间 是用来存放: 函数参数和函数返回值 临时变量 (括函数的非静态的局部变量以及编译器自动生产的其他临时变量) 保存上下文信息 (包括在函数调用前后需要保持不变的寄存器) # 栈是什么 准确定义:栈是只允许在一端进行插入或删除操作的线性表。 可以理解为栈是一种特殊的容器,用户可以将数据压入栈中 (入栈,push),...