
基础
文章平均质量分 94
ONESTAR博客
https://onestar.newstar.net.cn
展开
-
深入理解单例模式
目录【1】方法一:饿汉单例【2】方法二:懒汉单例【3】方法三:懒汉单例加强(同步方法)【4】方法四:懒汉单例加强(DCL)【5】方法五:DCL加强【6】方法六:懒汉单例加强(静态内部类)【6】方法七:枚举单例(最完美写法)总结单例模式有八种写法,不是说设计模式是代表了最佳的实践吗,这一下冒出八种写法,何谈最佳?每一种单例的写法基本上都可以破坏其单例的属性,这就带来了安全隐患,所以每一种写法都是在之前的基础上进行加强,但是比消此涨,这会增加空间复杂度或者时间复杂.原创 2021-02-25 08:56:50 · 366 阅读 · 0 评论 -
RESTful接口设计
目录一、概述1. 什么是REST2. REST和RESTful3. 为什么用RESTful接口4. RUSTful设计二、Springboot开发RESTful服务1. 创建Springboot项目2. 创建实体类3. 设计接口实例一、概述1. 什么是REST前提:理解REST首先要理解”资源“,所谓“资源”,就是网络上的一个实体,或者说是网络上的一个具体信息,可以是一段文本,一张图片,一首歌曲,一种服务,总之就是一个具体的实体,可以用一个URI(统一资源标识原创 2020-10-26 20:14:01 · 1043 阅读 · 0 评论 -
位操作(Bit manipulation)
直接上例题eg:给定一个整型变量 a ,写两段代码,第一个设置 a 的 bit 3,第二个清除 bit 3。在以上两个操作中,要保持其他位不变。分析:使用 #define 和 bit masks 操作。这是一个有极高可移植性的方法。最佳解决方法:#define BIT3(0x1 << 3)static int a;void set_bit3(void){...原创 2018-09-20 21:37:57 · 987 阅读 · 0 评论 -
C语言输出一般格式
%d:以带符号的十进制形式输出整数 %o:以八进制无符号形式输出整数 %x:以十六进制无符号形式输出整数 %u:以无符号十进制形式输出整数 %c:以字符形式输出,只输出一个字符 %s:输出字符串 %f:以小数形式输出单,双精度数,隐含输出六位小数 %e:以指数形式输出实数 %g:选用%f或%e格式中输出宽度较短的一...原创 2018-09-26 16:52:47 · 973 阅读 · 0 评论 -
指针
1、指针概念地址:分配给每个对象(变量、函数、数组.....)的内存单元都有一个唯一的编号,这个编号称之为存储单元的地址。 在内存中,这个编号按字节来编号。在C语言中,可以认为指针就是一个地址编号,一个变量的地址称为变量的“指针”2、指针变量指针变量也是一个变量(不是普通的变量),其保存的是另外一个对象的地址 & :取地址符。单目运算符,表示取xxx对象的地址 eg:&am...原创 2018-09-21 16:34:08 · 236 阅读 · 0 评论 -
malloc、calloc、realloc空间分配
空间分配分两种,一种是在栈上,一种是在堆上一、在栈上(stack)由系统自动分配 eg:声明在函数中一个局部变量 int b;系统自动在栈中为 b 开辟空间,自动回收、二、在堆上(heap)在堆上需要程序员自己申请,并指明大小p1 = (char*)malloc(10); p2 = (char*)calloc(4,20); //每个元素有 4 个字节,有 ...原创 2018-09-21 17:42:26 · 383 阅读 · 0 评论 -
C语言交换函数
#include <stdio.h>void swap1(int a,int b){ int t; t = a; a = b; b = t; return;}void swap2(int *a,int *b){ int t; printf("before a = %p b = %p\n",a,b); t = *a; *a = *b; ...原创 2018-09-21 22:30:58 · 9275 阅读 · 3 评论 -
数组指针
数组指针代码#include<stdio.h>int main(){ int arr[3][10]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}; int(*p)[10]; //数组指针,本质是指针,指向一个数组 p=arr; printf("**...原创 2018-09-22 14:38:34 · 294 阅读 · 0 评论 -
函数指针
在C语言中,函数也是有地址的,所以可以定义一个指针变量来保存函数的地址,这种指针变量称之为“函数指针”。(因为它指向一个函数)#include <stdio.h>int max_array(int *a, int n){ int max = a[0]; int i; for (i = 0; i < n; i++) { if (a[i] > max)...原创 2018-09-22 15:37:32 · 317 阅读 · 2 评论 -
C语言库函数strcpy、strcat、strcmp的原型实现
#include <stdio.h>#include <assert.h>//strcpy实现char *my_strcpy(char *arr,char *p){ assert((arr != NULL) && (p != NULL)); //如果arr和p为空则终止程序 char *s = arr; while(*p) { *a...原创 2018-10-15 16:57:00 · 1730 阅读 · 0 评论 -
中断(Interrupts)
一、什么是中断一般中断定义为:打断CPU指令执行顺序的事件,现代CPU框架为了能够及时响应外部或内部一些紧急事件,都有中断机制,并提供一些响应中断、处理中断等的一些中断机制。 中断 ==> 打断CPU执行的事件二、ARM Cortex M4 中断机制当中断控制器通知cpu,产生xx中断啦,这个时候,cpu会停止正在做的事件, 转到中断处理上来。而且,M4给不同的事件(中断),一个...原创 2018-09-26 12:46:20 · 2863 阅读 · 0 评论 -
const和#define相比有何优点
const的作用:定义常量、修饰函数参数、修饰函数返回值三个作用。被const修饰的东西受到强制保护,可以预防意外的变动,提高程序的健壮性。const常量有数据类型,而宏常量没有数据类型,编译器可以对前者进行类型安全检查,而后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。 有些集成化的调试工具可以对const常量进行测试,但不能对宏常量进行测试。...原创 2018-09-20 19:36:52 · 880 阅读 · 0 评论 -
变量与“零”的比较
分别写出BOOL、int、float、指针类型的变量 a 和“零”的比较语句BOOL : if ( !a ) or if ( a ) int :if ( a == 0 ) float :const EXPRESSION EXP = 0.00001 if ( a < EXP && a > -EXP)poin...原创 2018-09-25 19:46:17 · 454 阅读 · 0 评论 -
运算符的优先级与结合性总结
() [ ] -> . 自左向右! ~ ++ -- +- 自左向右 单目运算符* ...原创 2018-08-14 20:42:00 · 561 阅读 · 0 评论 -
预处理器之宏定义
以#开头的命令都是预处理命令,预处理不是c语言的语句,不能被编译器编译。所以在编译之前需要使用预处理器做文件的预处理工作。在编译之前,所有的预处理语句都要被处理(替换或展开)。eg1:一般宏定义#define NUM 100宏替换:将NUM替换为100,注:双引号的内容不会被替换 宏不会分配内存空间,没有数据类型 宏定义末尾不能有分号 宏定义一般要大写 宏定义可...原创 2018-08-15 12:34:21 · 938 阅读 · 0 评论 -
死循环(Infinitie loops)
一、whilewhile(1){ ;}1为表达式,每次循环都要判断表达式是否为 0二、forfor( ; ; ){ ;}括号里的两个 ;;代表两个空语句,编译器一般会优化掉它们,直接进入循环体三、LoopLoop:...goto Loop;常用在汇编语言编写和嵌入式程序编写中...原创 2018-08-16 12:30:02 · 470 阅读 · 0 评论 -
数据格式:大端模式(Big-endian)和小端模式(Little-endian)
有没有想过当定义一个变量的时候,这个变量在内存中是如何存放的呢?这就涉及到数据格式中的大端模式(Big-endian)和小端模式(Little-endian)大端模式(Big-endian):高位字节存放在内存的低端地址,低位字节存放在内存的高端地址 小端模式(Little-endian):低位字节存放在内存的高端地址,高位字节存放在内存的低端地址eg1:int a = 0x1234567...原创 2018-08-16 13:21:58 · 3744 阅读 · 2 评论 -
预处理之条件编译
代码能否编译是有条件决定的eg 1:#ifdef 标识符代码1#else代码2#endif如果#define 标识符,就使用代码1,否则使用代码2eg 2:#ifndef 标识符代码1#else代码2#endif和eg1相反,如果没有#define 标识符,就使用代码1,否则使用代码2eg 3:#if 表达式代码1#else代码2#endi...原创 2018-08-20 20:45:46 · 466 阅读 · 0 评论 -
全局变量和局部变量的区别
一、从作用域看:全局变量:其作用范围是“整个工程”,只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量 静态全局变量:使用 static 关键字修饰,也具有全局作用功能,和全局变量区别在于如果该程序包含多个文件,其作用范围仅在定义的那个文件,不能作用于其它文件,这样即使两个不同的源文件都定义了相同名字的静态全局...原创 2018-08-23 21:46:04 · 17215 阅读 · 0 评论 -
代码段(codesegment/textsegment)、数据段(datasegment)、bss段(bsssegment)、rodata段、栈(stack)、堆(heap)
在Linux进程地址空间布局中,从物理上,数据(user data, sys data) 和指令,都是“数据”,但是从逻辑上来讲,来是有区别的,不同的数据,属性不一样。有些数据是指令,只读,不可写,有些数据可写,有些数据只可读,有些数据一开始就存在,有些数据,用的时候才存在,用完就没有......从逻辑层面(操作系统)把数据分成不同的段(不同的区域)来存储:一、代码段(codesegmen...原创 2018-08-21 09:03:05 · 8497 阅读 · 5 评论 -
Static、Const、Volatile 的用法
一、Static:表示修饰的变量静态变量对于全局变量,修改作用域,使得全局变量仅仅在本文件内可以被访问 对于局部变量,修改生存期,使其随进程持续性,这个变量被分配到数据段或者bss段,只初始化一次,不改变作用域 对于函数,与全局变量的影响相同,修改作用域,使得该函数仅仅在本文件内可以被访问二、Const:使用其好处,是引入了常量的概念,让我们不要去修改不该修改的内存。直接的作用就...原创 2018-08-25 18:27:54 · 693 阅读 · 0 评论 -
C语言中的运算符
一、算术运算符:(双目运算符) 运算顺序 :左--->右 包括:* / + - % %:取余运算符,在C语言中,要求两个操作数必须为整数 注:整数/整数 其结果还是整数,要想结果为实数,可在分子*1.0(数据类型隐式转换)二、关系运算符: (双目运算符) 运算顺序:结合性 左--->右,表示两个式子的关系 包括: >...原创 2018-08-14 10:47:56 · 1749 阅读 · 0 评论