
C
文章平均质量分 83
wuguinianjing
这个作者很懒,什么都没留下…
展开
-
简单判断输入的类型
if(scanf("%d",&h)!=1)printf("it's not a number!\n");因为scanf是从缓存中读取输入的数据如果你输入的不是数字,就会返回0,如果是数字就会返回1;一般人不知道scanf还有返回值,就可以看看头文件中scanf的定义了。其实我还有一个更好的办法,你输入的不是数字就要他重新输入,直到输入的是数字为止,这样是最好的写法。程序如下:#include <stdio.h>int main(){int h;while(!scanf原创 2020-12-07 22:51:54 · 605 阅读 · 0 评论 -
memcpy与memmove的区别
memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:void *memcpy(void *dst, const void *src, size_t count);void *memmove(void *dst, const void *src, size_t count);他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。第一种情况下,拷贝转载 2020-12-04 13:29:30 · 132 阅读 · 0 评论 -
exit与return的区别
exit(0):正常运行程序并退出程序。exit(1):非正常运行导致退出程序;return():返回函数,若在主函数中,则会退出函数并返回一值。拓展知识:return返回函数值,是关键字; exit 是一个函数。return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束。return是函数的退出(返回);exit是进程的退出。return是C语言提供的,exit是操作系统提供的(或者函数库中给出的)。return用于结束一个函数的执行,将函数的执原创 2020-11-24 22:12:36 · 138 阅读 · 0 评论 -
类型的归总
类型sizeof 计算变量或数据类型所占的字节个数在32 位的系统上short 占据的内存大小是2 个byte;int 占据的内存大小是4 个byte;long 占据的内存大小是4 个byte;float 占据的内存大小是4 个byte;double 占据的内存大小是8 个byte;char 占据的内存大小是1 个byte。bool 占据的内存大小是1 个byte。void 不能定义变量,但可以定义指针常见的ASICII值'a' // 97'A' // 65'\0' //原创 2020-11-19 16:25:51 · 320 阅读 · 0 评论 -
字节序(小端存放、大端存放)
小端存放低地址存放低位大端存放低地址存放高位怎么判断大小端存放输入一个0x0001 用char*来解析内存,小端则得到01,大端则得到00。原创 2020-11-19 13:18:20 · 271 阅读 · 0 评论 -
栈内的连续存储
#include<iostream>#include<stdlib.h>using namespace std;typedef struct Strudent{ char name[20]; int age; int score; }student;int main(){ student s{}; int a, b, c, d; a = 1; b = 2; c = 3; //d(4);//错误,编译器以为我们这个是个函数调用 int e(5);//原创 2020-11-16 17:04:43 · 880 阅读 · 0 评论 -
数据报的可变部分的设计
IP数据报,其可变部分可变是如何实现的?假设我们在网络通信过程中使用的数据缓冲区,缓冲区包括一个num, size和data字段,分别标识数据的块号,长度和传输的数据,我们设计思路如下:定长数据缓冲区,设置一个足够大小MAXSIZE的数据缓冲区。设置一个指向实际数据的指针,每次使用时,按照数据的长度动态的开辟数据缓冲区的空间。我们从实际场景中应用来考虑他们的优劣,主要考虑点有:缓冲区空间的开辟,释放和访问.1 定长包:#define MAX_SIZE 4096 //4Ktypedef str原创 2020-11-16 16:37:58 · 172 阅读 · 0 评论 -
二维数组为什么不会继续退化
int (*monthp)[31]为什么无法转换为int ** 一般解释(类型不同,其存储方式不同) 二维数组需要数组指针来指向,它还保存着指向数组的元素个数,而二级指针指向数组将元素全丢了,就像声明时为什么二维数组不能省略列一样,行代表了元素个数(可以计算出来),列代表了元素里拥有的个数。但是按这种理解,二维数组为什么不能像一维数组一样靠丢失元素个数,然后在传参的时候传入行和列来换取节省的空间和时间上的花销呢?为什么编译器提醒两者之间无法进行转换呢?...原创 2020-11-16 16:29:58 · 196 阅读 · 0 评论 -
编译器的工作
编译器的编译顺序?编译器从上到下顺序扫描程序。sizeof() 编译时计算出来 ++运行时才进行原创 2020-11-14 22:03:00 · 167 阅读 · 0 评论 -
main函数的入口函数
为什么栈空间是1M在main函数里定义一个1M大小的数组程序会崩溃?原创 2020-11-12 23:48:47 · 280 阅读 · 0 评论 -
运算符 表达式
1.运算符优先级1.优先级最高者并不是真正意义上的运算符,包括:数组下标、函数调用、操作符各结构成员选择操作符 自左向右 a.b.c – (a.b).c2.单目运算符,自右向左 (*p)() 不可省略括号 p++会被编译器解释成(p++),即取指针p所指向的对象,然后p+1;而不是(*p)++,取指针p所指向的内容,然后将内容+13.双目运算符4.移位运算符5.关系运算符6.按位运算符7.逻辑运算符8.三目运算符9.赋值运算符10.逗号运算符 (宏定义比较多)ps:sizeof原创 2020-11-10 03:13:02 · 182 阅读 · 0 评论 -
malloc申请堆内存
1.malloc申请的空间,是否记录空间大小?若是记录,那所记录的空间大小在哪呢?为什么利用free释放不需要空间大小参数呢?2.malloc函数的相关堆分配算法3.malloc申请失败,即可使用的内存满时应该怎么办?...原创 2020-11-23 01:17:53 · 2780 阅读 · 0 评论 -
值传递、地址传递、引用传递
值传递:值传递使得实参与形参没有联系,函数与函数之间没有耦合性,在各自的函数里修改值不会改变各自本身的值。但这也是它的缺陷。1.实参传入被调函数无法交换数值。2.当传入值大于8字节即需要进行整体拷贝,无论是开辟的空间还是数据的拷贝都相对较大(这也是设计数组退化为指针的原因),而指针传递只有4个字节所以需要地址传递来进行传参。地址传递地址的传递,使得传入的参数是地址,而*解引用去操作该地址的内存,使得在被调函数中也可以修改主调函数中的实参值(这也是其不好的一点,看你怎么利用)。但其传参后还需要进原创 2020-11-09 01:37:41 · 966 阅读 · 0 评论 -
linux线程
1 线程的概念:进程内部的一条执行序列(执行流,有序指令的集合),一个进程可以包含多条线程,至少有一条线程,就是main方法所代表的这条执行流- -主线程。进程中的线程仅仅是有一个独自的栈区空间(区别于栈帧)(包含了线程执行的数据)线程管理的提出前,OS一直以进程作为独立运行的基本单位为什么使用线程?(性能问题) 提出一种新的实体,线程1.满足实体之间可以并发的执行(与进程类似)2.实体之间共享相同的地址空间和相同的资源(与进程不同,进程的地址空间相对是独立的,若A进程要访问B进程的地址空间需原创 2020-11-07 01:20:56 · 266 阅读 · 0 评论 -
常用头文件的函数
1 printf1.printf() //其是一个函数,也存在调用关系等 2 assertassert(条件判断) //<assert.h>//断言函数,在DEBUG编译后的obj文件中加入调试信息,release被忽略。如果条件判断不满足则打印导致不满足条件的原因和行数,返回值为空(void)3.itoaitoa(int value,char *string,int base) //广泛使用的非标准C语言和C++语言扩展功能,因此不能好好的被所有编译器使用//<原创 2020-11-07 01:13:09 · 1528 阅读 · 0 评论 -
C的字符串库
size_t my_strlen(const char *str)//注意返回类型是size_t{ const char * p = str;//利用指针 while (*p != '\0') { p++; } return p-str;}char * my_strcpy( char *dest, const char *src)//返回值使得其能连续拷贝{ char *p = dest;//保证dest指向不变 while (*p++=*src++);// 运算符本身可以看做原创 2020-10-31 00:49:08 · 220 阅读 · 0 评论 -
查找
顺序查找二分查找(数组有序)原创 2020-10-28 12:06:39 · 87 阅读 · 0 评论 -
函数调用堆栈
#include<stdio.h>int sum(int a, int b){ /*push ebpmov ebp,esp//将ebp移到栈顶(做新栈内存的栈底)sub esp,0CChpush ebx //空间初始化push esipush edilea edi,[ebp-0CCh]mov ecx,33hmov eax,0CCCCCCCChrep stos dwo原创 2020-10-23 00:56:14 · 406 阅读 · 0 评论 -
C语言归总学习2
C总结原创 2020-10-18 12:44:45 · 2833 阅读 · 0 评论 -
预处理、编译、链接
预处理、编译、链接的归总首先编译器进行语法分析,也就是要把那些字符串分离出来。然后进行语义分析,就是把各个由语法分析分析出的语法单元的意义搞清楚。最后生成的是目标文件,也称为obj文件。再经过链接器的链接就可以生成最后的EXE文件了。有些时候需要把多个文件产生的目标文件进行链接,产生最后的代码。这一过程称为交叉链接。原创 2020-10-16 17:53:27 · 1401 阅读 · 0 评论 -
C语言的归总学习1
C语言的归总学习第一节 C语言的相关知识1 计算机的组成其中总线按功能和规范可分为五大类型:1.1 数据总线:在CPU与RAM之间来回传送需要处理或是需要储存的数据。1.2 地址总线:用来指定在RAM之中储存的数据的地址PS:地址总线的位数不代表CPU位数1.3 控制总线:将微处理器控制单元的信号,传送到周边设备。1.4 扩展总线:外部设备和计算机主机进行数据通信的总线,例如ISA总线,PCI总线。1.5 局部总线:取代更高速数据传输的扩展总线。PS:其中的数据总线DB、地址总线AB和原创 2020-10-15 16:31:33 · 1451 阅读 · 0 评论