![](https://img-blog.csdnimg.cn/20190918140053667.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C
学习中的一些见解或者笔记
楚渐灵
没有比人更高的山,没有比脚更长的路。
展开
-
C/C++中的内存管理
在C语言中,用 malloc/realloc/calloc和free实现动态内存管理,在C++中则使用的是 new 和 delete举个栗子:int main(){ int *p1 = new int; // 动态申请一个int类型的空间 int *p2 = new int(0); // 动态申请一个int类型的空间并初始化为0 int *p3 = new int[5]; /...原创 2020-05-05 17:07:15 · 163 阅读 · 0 评论 -
字符函数和字符串函数
size_t strlen(const char* str); 求字符串长度字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )参数指向的字符串必须要以 ‘\0’ 结束函数的返回值为size_t,是无符号的(特别注意用返回值相减然后与 0 比较大小)char* strcpy(char * destination, const char * source ); 字符串拷贝源字符串必须以 ‘\0’ 结束会将源字符串中的原创 2020-10-20 12:33:04 · 206 阅读 · 0 评论 -
多维数组初始化用到小括号
#include <stdio.h>int main() { int a[3][2] = { (0, 1), (2, 3), (4, 5) }; printf("%d\n",a[0][0]); printf("%d\n",a[0][1]); printf("%d\n",a[1][0]); return 0;}运行结果如下:为什么会是 1 3 5?因为这算是逗号运算符:优先级别最低,将两个以上的式子联接起来,从左到右逐个计算表达式,整个表达式的值为最后一个表达式的值。例如原创 2020-10-20 11:15:38 · 817 阅读 · 2 评论 -
协程实现网络服务器
对于操作系统而言,进程是最小的资源管理单元,线程是最小的执行单元。对于一个线程,在使用中,性能可能会受到以下因素的影响:涉及到线程阻塞状态和可运行状态之间的切换线程上下文的切换同步锁……所以引入协程——更加轻量级的线程。就像进程和线程的关系一样,一个进程可以拥有多个线程,一个线程可以拥有多个协程。协程是在用户态执行的,所以不会像线程切换那样消耗资源,使性能得到提升。可以说,线程是一个特殊的函数,这个函数可以在某个地方挂起,并且可以在挂起处继续运行。一个线程内可以由多个这样的特殊的函数在运行原创 2020-10-01 11:30:47 · 1034 阅读 · 2 评论 -
预处理有关
关于 #define 的一些技巧:#define PRINT(FORMAT,VALUE) printf("The value is "FORMAT"\n",VALUE)PRINT("%d",x + 3);这种技巧只有当字符串常量作为宏参数给出时才能使用。第二个技巧使用预处理器把一个宏参数转换成一个字符串。#argument 这种结构被预处理器翻译为 “argument”。这种翻译可...原创 2020-02-12 10:46:57 · 121 阅读 · 0 评论 -
指针数组和数组指针
先写一个数组指针int arr[3][5]; //这是一个普通的二维数组int (*p)[5]; //这是一个指向数组的指针下标优先级高于间接访问,但是由于括号的存在,首先执行的还是间接访问。所以,p 是个指针,一个指向整型数组的指针。在声明中加初始化就是下面这个样子:int (*p)[5] = arr; 换句话说,这里的指针表示二维数组的行下面说一下指针数组// 举个例子,...原创 2020-02-08 12:51:05 · 108 阅读 · 0 评论 -
移位操作符
左移在左移位中,值最左边的几位被丢弃,右边多出来的几个空格则由 0 补齐。如上图。右移右移位操作存在一个左移位操作不曾面临的问题,从左边移入新位时,可以选择两种方案。一种是逻辑移位,左边移入位用 0 填充;另一种是算数移位,左边移入的位由原来的符号位决定,符号位为 1 则移入的位均为 1 ,符号位为 0 的则移入的位均为 0 ,这样能保持原来数的正负形式不定。如果值 10010110 右移...原创 2020-02-07 21:32:50 · 1368 阅读 · 0 评论 -
计算结构体大小
原本以为结构体的大小就是里边各个成员变量的大小总和,但是运行结构并不是这样,原来结构体大小计算还有一个规则——内存对齐内存对齐规则1.第一个成员在与结构体变量偏移量为0的地址处。2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。从零偏移处开始,按字节大小计算,判断此偏移地址是否为该成员变量和对齐参数两者之间的最小值,若是,则从此处开始占用内存,大小为该类型所占字节数值,若不...原创 2019-11-21 10:51:02 · 183 阅读 · 1 评论 -
字符串函数的实现, memmove() 函数的实现和解析
strlen 函数的实现int my_strlen(char* dst) { assert(dst); char* ret = dst; int count = 0; while (*ret!='\0') { ++ret; ++count; } return count;}strcat 函数的实现har* my_strcat(char* dst, const ...原创 2019-11-17 23:49:44 · 291 阅读 · 0 评论 -
生成随机数
有些时候需要随机选取一些人去干某些事情,所以就需要一个随机数生成器,当然啦,如果你恰巧不想去,也不好给别人说,能做的就是在生成随机数上边动动手脚啦!(本文只是突发奇想写的一个小程序,仅仅是在想peach,该干活的时候还得干,千万不要耍小聪明,不要偷懒,谨记!)#include<stdio.h>#include<malloc.h>#include<stdlib...原创 2019-11-14 11:14:23 · 206 阅读 · 0 评论 -
插入排序
思想插入排序(Insertion Sorting)的基本思想是:把 n 个待排序的元素看成为一个有序表和一个无序表,开始时有 序表中只包含一个元素,无序表中包含有 n-1 个元素,排序过程中每次从无序表中取出第一个元素,把它的排 序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。图解将每个元素和其他元素进行对比,如果,然后将这个元素插入到合适的...原创 2019-11-03 21:04:53 · 88 阅读 · 0 评论 -
整型数据的存储和相关练习题
计算机中的有符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位 三种表示方法各不相同。原码 直接将二进制按照正负数的形式翻译成二进制就可以。反码 将原码的符号位不变,其他位依次按位取反就可以得到了。补码 反码+1就得到补码。正数的原、反、补码都相同。为什么呢?在计算机系统中,数值一律用补码来...原创 2019-10-25 17:09:05 · 476 阅读 · 0 评论 -
C 语言关于函数参数是数组的一个bug
话不多说,先看代码!#include<stdio.h>#include<stdlib.h>int array(int arr[]) { int size = sizeof(arr) / sizeof(arr[0]); printf("size = %d\n", size);}int main() { int a[4] = { 1,2,3,4 }; ar...原创 2019-10-02 20:46:57 · 377 阅读 · 0 评论 -
Git的安装和Github的使用
Git 是为了保存自己的代码,以及代码版本,但是Git本身只是版本控制工具,所以要用到 GIthub 来保存自己的代码。 Git 的作用有三个!1.防止代码被喵星人吃掉。(防止自己代码打好之后被不小心删除掉)2.防止程序猿把产品经理打死。(把代码的版本都保存,想用哪个版本用那个版本)3.防止程序猿和程序猿之间互殴。(同样的保存好版本,免得别的人把代码改了出现问题)...原创 2019-10-02 19:53:38 · 292 阅读 · 1 评论 -
二分法查数字
#include<stdio.h>#include<stdlib.h>int BinarySearch(int arr[],int size,int to_find) { int left = 0; int right = size - 1; while (left <= right) { int mid = (left + right) / 2;...原创 2019-09-25 12:48:03 · 165 阅读 · 0 评论