C
onetime0503
这个作者很懒,什么都没留下…
展开
-
C语言 左移溢出
2. 左移操作中,若常量移位到符号位,会得到错误的结果(如图变量b c),具体错误的结果依赖于编译器的实现方式,此时需要进行强制类型转换(如图变量a d)1. 在c语言中,常量的默认类型为signed int(如图变量b c)原创 2023-03-03 15:32:20 · 506 阅读 · 0 评论 -
嵌入式C常见面试题
1. 展开的时机:inline函数在编译时展开,#define在预处理时展开 2. 参数的类型检查: inline函数还是一个函数,会进行参数类型检查,而#define不会,只是做简单的字符串替换 3. 是否允许复杂语句:inline函数不允许出现复杂语句,例如递归,大型循环等;#define一定展开。对应短小精悍且被频繁调用的函数,加上inline关键字会在编译时在函数调用位置替换为函数的代码块,节省函数调用的时间和对栈内存重复开辟带来的消耗,代价上增加了程序文件的大小。原创 2022-10-21 09:43:58 · 182 阅读 · 0 评论 -
常用算法总结
【代码】常用算法总结。原创 2022-09-09 16:50:10 · 192 阅读 · 0 评论 -
局部变量定义顺序与地址顺序
局部变量的定义顺序与存储顺序不一定一致,具体与编译器和平台相关。从编译器的角度来说,变量的地址是可以随机安排的,又不影响寻址使用,不一定非要按排列顺序。一般而言,编译器按照内存地址递减的方式给局部变量分配内存,如下图:...原创 2021-03-18 10:06:39 · 722 阅读 · 0 评论 -
位运算常用技巧
1、获得第 i 位的数字(a>>i)&12、设置第 i 位为 1a=a|(1<<i)3、设置第 i 位为 0a=a&(~(1<<i))4、把第 i 位取反a=a^(1<<i)5、lowbit函数(用来取一个二进制最低位的1与后边的 0 组成的数)方法一:a&(-a) ,原理:二进制数的负数是正数取反加一方法二: a - ( a & (a-1) ),原理: 先消掉最后一位1,然后再用原...原创 2021-03-03 13:47:27 · 271 阅读 · 0 评论 -
前缀和
预备知识前缀和是一个数组的某项下标之前(包括此项元素)的所有数组元素的和。设a[]为原数组,b[]为前缀和数组,可得,前缀和的定义式和递推式如下图所示:其中,一维数组的前缀和的递推式可以很容易看出来,二维数组的前缀和的递推式证明如下:如图,灰色阴影的面积 S(O,D)=S(O,C)+S(O,B)−S(O,A)+D。设preSum[i][j]表示从matrix[0][0]到matrix[i][j]的所有元素的和,则可以得出以下的递推公式:preSum[i][j]=preSum[i−1]原创 2021-03-02 15:11:27 · 114 阅读 · 0 评论 -
异或
异或,英文为 exclusive OR,缩写成 xor。异或的数学符号为 “⊕”,C语言中的运算符为“^”。异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用 1 表示真,0 表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为 0,异为 1)。运算法则1.归零律:a ⊕ a = 02.恒等律:a ⊕ 0 = a3.交换律:a ⊕ b = b ⊕ a4.结合律:a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ...原创 2021-02-24 15:19:30 · 4753 阅读 · 1 评论 -
Leetcode中参数returnSize和returnColumnSizes的解释
Leetcode中,一些题目会传入 returnSize 和 returnColumnSizes 这两个参数。例如:int** flipAndInvertImage(int** A, int ASize, int* AColSize, int* returnSize, int** returnColumnSizes)之所以传入指针,是因为C语言是值传递,如果传的是值,无法改变传入的值。题目中要求会返回一个二维数组,且数组的行数列数是可能被function改变的。在这个题目中,二维数组A的行数是原创 2021-02-24 14:51:33 · 4501 阅读 · 2 评论 -
向上取整
在C语言中,取整操作总是把小数部分截断。因此当操作数为正的时候,相当于向下取整。以下讨论的方法都是操作数为正的情况,操作数为负和浮点数的情况不作讨论。方法一:检查余数int func1(int x, int n){ int remainder; int sum = x / n; if( x % n ) { sum++ } return sum;}方法二:增加一点小处理(推荐)int func1(int x, int原创 2021-02-04 10:54:31 · 1123 阅读 · 0 评论 -
地址与内存空间
数据总线,地址总线,运算位宽32位CPU指的是运算位宽为32位,通常也是指的是通用寄存器的位宽。CPU通过地址总线寻址,然后通过数据总线与外设通信。地址总线位数决定CPU寻址范围;数据总线的位数决定CPU单次通信能交换的信息数量。CPU位宽与寻址能力并不完全等效,具体看CPU的设计:CPU 的位宽一般是以min {ALU 位宽、通用寄存器位宽、数据总线位宽} 决定的!也就是说 CPU 由 ALU、通用寄存器、数据总线三者之中最少的位宽决定!所以 CPU 位宽与其寻址能力并不是挂钩的!也.原创 2021-02-02 14:32:25 · 847 阅读 · 1 评论 -
递归算法debug技巧
在debug递归函数的时候,最常见的做法是在IDE里一步一步打断点下去看。但是有一个问题是容易绕晕。这里分享一个比较直观方便的技巧,参考自<<分享一个小技巧,提高刷题幸福感>>。在递归函数中,缩进最能提升我们debug的效率。打印关键值,配合缩进,可以更加直观地观察递归函数执行情况。因此我们新定义一个函数printIndent和一个全局变量count:// 全局变量,记录递归函数的递归层数int count = 0;// 输入 n,打印 n 个 tab 缩进...原创 2021-01-28 16:36:03 · 1472 阅读 · 0 评论 -
C Training 3
#include <stdtypes.h>#define HEAD_SIZE (sizeof(HEAD_STRUCT))////control block structure//typedef struct _HEAD_STRUCT{ UINT size;// data block size struct _HEAD_STRUCT xdata *pFLink;// next structure pointer} HEAD_STRUCT, xdata *PHEA...原创 2021-01-27 14:29:00 · 125 阅读 · 0 评论 -
C Training 2
Doubly-Linked List////doubly-linked list structure//typedef struct _LIST_ENTRY{ struct _LIST_ENTRY xdata *pFLink; struct _LIST_ENTRY xdata *pBLink;} LIST_ENTRY, xdata *PLIST_ENTRY;////ListInitializeHead// initialize the head of a doubly-原创 2021-01-27 14:29:54 · 77 阅读 · 0 评论 -
C Training 1
singly-Linked List//// singly-linked list structure//typedef struct _LINK{ struct _LINK xdata *pLink;} LINK, xdata *PLINK;//// link head structure//typedef struct _LINK_HEAD{ PLINK pHead; PLINK pTail;} LINK_HEAD, xdata *PLINK_.原创 2021-01-27 14:30:19 · 141 阅读 · 0 评论 -
插入排序
直接插入排序基本思想将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增 1 的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。C实现(默认升序排列)void InsertSort(int *arr, int len){ int tmp; int i; int j; for (i = 1; i < len; i++) { tmp = arr[i];//待插入的元素 f原创 2021-01-26 14:58:12 · 64 阅读 · 2 评论 -
匿名联合/结构体
GCC (https://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/Unnamed-Fields.html#Unnamed-Fields) 允许在联合/结构体中定义一个无名称的联合/结构体,例如:struct { int a; union //无名称的联合 { int b; float c; }; int d;} foo;可以直接访问无名称联合体的成员,例如: foo.b。如果直接定义一原创 2021-01-21 17:33:09 · 789 阅读 · 0 评论 -
常量的默认类型与移位
常量的默认类型C语言中的常量分为整形常量、浮点数常量、字符常量、字符串常量。整型常量的默认数据类型是int类型,即有符号整型。浮点数常量的默认类型是double类型,即长浮点数类型。字符常量的默认类型是char类型,即有符号字符类型,字符串常量的类型,一般为const int类型。同时,不同的编译器,略有不同,但一般遵守该规则。数据类型对应字节数 引用:https://blog.csdn.net/zhangxinbin5/article/details/7929591不同...原创 2021-01-19 13:52:45 · 2117 阅读 · 0 评论 -
Record -> C
用malloc给指针分配空间1. 分配的是数组时,malloc大小应为数组大小ex:int *a = (int *)malloc(sizeof(int)*N) //note: 分配的是数组时,malloc大小应为数组大小数组作为函数返回值1. 返回的数组不能是定义在函数内的数组。 因为函数内定义的数组是局部变量,函数结束时被释放。虽然没有语法错误,但是地址里的值已经没有意义。头文件重复包含的问题#ifndef X //X为标识符,可以随便取名一般取名为大写的头文...原创 2020-11-23 10:31:54 · 148 阅读 · 0 评论 -
概念区分之 进程与线程
进程(Process):每个进程都有自己独立的地址空间,使得进程之间的地址空间相互隔离。进程的总体目标是希望每个进程从逻辑上来看都可以独占计算机的资源。线程(Thread): 优势被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。区别和联系:通常意义上,一个进程由一个到多个线程组成,各个线程之间共享程序的内存空间(包括代码段,数据段,堆等)及一些进程级的资源(如打开文件和信号)。原创 2020-09-10 14:03:59 · 125 阅读 · 0 评论 -
数组和指针总结
来源: <<C 专家编程>>原创 2020-07-16 17:38:23 · 105 阅读 · 0 评论 -
C 可变参数函数的实现方法
基本原理在C中,函数形参从右往左入栈,且栈是从高地址往低地址方向增长。通过利用指针,可以访问未出现在列表中的参数。实现步骤相关宏定义如下://define in stdarg.h#define va_start __crt_va_start#define va_arg __crt_va_arg#define va_end __crt_va_end//define...原创 2018-09-06 13:36:43 · 1493 阅读 · 0 评论