c语言
not_give_up_
这个作者很懒,什么都没留下…
展开
-
如何阅读源码
分析一个源代码,一个有效的方法是: 1、阅读源代码的说明文档,比如本例中的README, 作者写的非常的详细,仔细读过之后,在阅读程序的时候往往能够从README文件中找到相应的说明,从而简化了源程序的阅读工作。 2、如果源代码有文档目录,一般为doc或者docs, 最好也在阅读源程序之前仔细阅读,因为这些文档同样起了很好的说明注释作用。 3、从makefile文件入手,分析源代码的层次转载 2017-03-30 12:08:26 · 217 阅读 · 0 评论 -
彻底搞定C指针
1.语言中变量的实质 要理解C指针,我认为一定要理解C中“变量”的存储实质,所以我就从“变量”这个东西开始讲起吧! 先来理解理解内存空间吧!请看下图:内存地址→ 6 7 8 9 10 11 12 13--------------------------------------------------转载 2017-12-16 22:09:59 · 215 阅读 · 0 评论 -
二叉树的用处
二叉排序树是一种比较有用的折衷方案。 数组的搜索比较方便,可以直接用下标,但删除或者插入某些元素就比较麻烦。 链表与之相反,删除和插入元素很快,但查找很慢。 二叉排序树就既有链表的好处,也有数组的好处。 在处理大批量的动态的数据是比较有用。 文件系统和数据库系统一般都采用树(特别是B树)的数据结构数据,主要为排序和检索的效率。二叉树是一种最基转载 2018-01-02 21:07:01 · 6733 阅读 · 0 评论 -
为什么要使用补码
想必对于原码,反码,补码大家并不陌生,计算机专业的同学都会学到这方面的一些知识。 当初在学这部分的时候,只知道用补码可以解决0和-0的问题,但是还是没明白为什么会想到用补码。 前阵子看了斯坦福大学关于范式编程的公开课,里面老师讲了这方面的内容,三言两语给出了一个简单明了的解释,顿时觉得好棒! 思路如下: 我们主要要解决的问题就是负数的表示,而转载 2018-01-02 21:52:37 · 284 阅读 · 0 评论 -
按位运算符
1.按位取反或者二进制补码:~ 把1变为0,把0变为12.按位与 :& 任何位与0组合都为0,任何位与1组合都为本身 应用:关闭位(清空位)需要打开一个值中的特定位,同时保持其他位不变(所有位为0) 把1变为0,其余位不变。假设有一个二进制数00011010 ,从左到右的第4位1表示开关,现在要关闭开关(置为0)。而其余的位表示其他功能,这些功能不变。所以此时原创 2018-01-02 22:11:35 · 2451 阅读 · 2 评论 -
#error的用法
编译程序时,只要遇到 #error 就会跳出一个编译错误,既然是编译错误,要它干嘛呢?其目的就是保证程序是按照你所设想的那样进行编译的。下面举个例子:程序中往往有很多的预处理指令#ifdef XXX...#else#endif当程序比较大时,往往有些宏定义是在外部指定的(如makefile),或是在系统头文件中指定的,当你不太确定当前是否定义了 XXX 时,转载 2018-01-03 20:59:37 · 10933 阅读 · 0 评论 -
fscanf和fprintf的用法
1.fscanf():从文件指针fp指向的文件中,按format中对应的控制格式读取数据,并存储在agars对应的变量中;原型: fscanf(FILE *fp, const char *format, agars)#include#includeint main(){ FILE *fp; char ch; fp =转载 2018-01-04 22:51:31 · 2988 阅读 · 0 评论 -
c语言面试题
预处理问题1:什么是预编译?何时需要预编译?答:预编译又称预处理,是整个编译过程最先做的工作,即程序执行前的一些预处理工作。主要处理#开头的指令。如拷贝#include包含的文件代码、替换#define定义的宏、条件编译#if等。.何时需要预编译:1、总是使用不经常改动的大型代码体。2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为...转载 2018-03-29 21:30:51 · 4302 阅读 · 0 评论 -
c语言面试题
static有什么用途?(请至少说明两种)1.限制变量的作用域2.设置变量的存储域7. 引用与指针有什么区别?1) 引用必须被初始化,指针不必。2) 引用初始化以后不能被改变,指针可以改变所指的对象。2) 不存在指向空值的引用,但是存在指向空值的指针。8. 描述实时系统的基本特性在特定时间内完成特定的任务,实时性与可靠性9. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?全局变量储存在...转载 2018-03-29 21:39:04 · 276 阅读 · 0 评论 -
TCP和UDP的区别和优缺点
1、TCP与UDP区别总结:1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。3、UDP具有较...转载 2018-05-01 09:52:25 · 271 阅读 · 0 评论 -
单链表,循环链表和双向链表
单链表: 一.单链表与顺序表相比: 1.顺序表可以方便的随机存取表中的任一节点,速度快;但是在表中插入删除一个数据时,为了保持其他元素的相对次序不变,平均需要移动一半的元素,效率很低;还有若事先对表长估计不足,过小会形成内存浪费,过大则需要拷贝到一个更大的数组,时间开销很大。 2.相反,链表则适用于插入删除频繁,表长估计不定的情形。 3.单链表中的逻辑位置连续,物理位置非连续;而顺序...转载 2018-05-01 12:26:40 · 1596 阅读 · 0 评论 -
c语言面试题 指针30个常错题型
1. char * const p;char const * pconst char *p上述三个有什么区别?char * const p; //常量指针,p的值不可以修改char const * p;//指向常量的指针,指向的常量值不可以改const char *p; //和char const *p——————————————————2. char str1[] = “abc”;char st...转载 2018-04-26 17:51:10 · 806 阅读 · 0 评论 -
函数指针
C语言的这句定义 typedef void (*handler_t)(uint8_t * )的解释定义一个函数指针类型。一步一步分解第一行:typedef void (*handler_t)(uint8_t * ); 第二行:最内层 (uint8_t * ) 函数的参数列表 ,仅有一个参数,为uint8_t类型的指针第三行:void (*handler_t) 函数指针 该函数指针 指向一个...转载 2018-05-18 17:03:03 · 367 阅读 · 0 评论 -
关于typedef的用法总结
不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中。typedef与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了,看了网上一些C/C++的学习者的博客,其中有一篇关于typedef的总结还是很不错,由于总结的很好,我就不加修改的引用过来了,以下是引用的内容(红色部分是我自己写的内容)。用途一:定义一种类型的别名,而不只是简单...转载 2018-05-18 17:11:39 · 204 阅读 · 0 评论 -
malloc()和free()
一、malloc()和free()的基本概念以及基本用法:1、函数原型及说明:void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。关于分配失败的原因,应该有多种,比如说空间不足就是一种。void free(void *FirstByte): 该函数是将之前转载 2017-12-16 22:07:50 · 431 阅读 · 0 评论 -
malloc与sizeof的合用的陷阱
1.关于malloc与void *指针 还是分析上述代码:首先,malloc返回的值是void *类型,没有必要进行类型转化。而且这样会降低代码的易读性,很容易让你忽略malloc这个函数,从而导致忘记添加#include。第二,sizeof不是一个函数,它只是一个运算符,sizeof部分在编译之前就已经确定。第三,我们推荐的用法是malloc后面的单位最好转载 2017-12-16 22:02:10 · 4284 阅读 · 0 评论 -
数组与strcpy
示例说明1·最终答案输出是 "ABC\0";· 为什么答案不是"ABC\0ef"; (1) strcpy会拷贝‘/0’. (2) 用printf输出时,遇到‘/0’就会结束输出。所以会出现上面的结果。 总之:复制就是用新的内容覆盖原有的内容,包括结束标志,所以以字符串格式输出时,就只是输出被复制的内容,碰到结束标志时就结束了,原来没原创 2017-12-16 21:54:25 · 1214 阅读 · 0 评论 -
链表
链表概述 链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它可以根据需要开辟内存单元。链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址。因此,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为转载 2017-03-31 14:45:45 · 318 阅读 · 0 评论 -
交换变量值的方法
j交换a,b的三种方法(1)需要用到第三个变量temp(2)不使用第三个变量.@1.算术算法 @2.逻辑算法a=a+b; a=a^b; b=a-b; b=a^b; a=a-b; a=a^b;原创 2017-03-25 15:02:01 · 386 阅读 · 0 评论 -
指针申请空间
以下是经典程序(载自林锐的从c/c++高质量编程),讲解的部分是我个人理解void GetMemory(char *p,int num){ p=(char*)malloc(sizeof(char)*num); //p是形参指向的地址}void main(){ char *str=NULL; GetMemory(str,100); //str是实参指向的地转载 2017-04-01 23:22:47 · 1582 阅读 · 2 评论 -
c指针
c语言中变量的实质要理解C指针,我认为一定要理解C中“变量”的存储实质, 所以我就从“变量”这个东西开始讲起吧!先来理解理解内存空间吧!请看下图:内存地址→ 6 7 8 9 10 11 12 13-------------------------------------------------------转载 2017-04-04 22:41:53 · 190 阅读 · 0 评论 -
冒泡排序
经典排序算法 - 冒泡排序Bubble sort原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子例子为从小到大排序,原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 |第一趟排序(外循环转载 2017-04-13 22:13:40 · 161 阅读 · 0 评论 -
快速排序
经典排序算法 - 快速排序Quick sort原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列举个例子如无序数组[6 2 4 1 5 9]a),先把第一项[6]取出来,用[6]依次与其余项进行比较,转载 2017-04-13 22:46:50 · 137 阅读 · 0 评论 -
选择排序
经典排序算法 - 选择排序Selection sort顾名思意,就是直接从待排序数组里选择一个最小(或最大)的数字,每次都拿一个最小数字出来,顺序放入新数组,直到全部拿完再简单点,对着一群数组说,你们谁最小出列,站到最后边然后继续对剩余的无序数组说,你们谁最小出列,站到最后边再继续刚才的操作,一直到最后一个,继续站到最后边,现在数组有序了,从小到大举转载 2017-04-13 23:12:27 · 166 阅读 · 0 评论 -
C语言文件mode说明
w+以纯文本方式读写,而wb+是以二进制方式进行读写。mode说明:w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。wb 只写方式打开或新建一个二进制文件,只允许写数据。wb+ 读写方式打开或建立一个二进制文件,允许读和写。r 打开只读文件,该文件必须存在,否转载 2017-10-29 18:42:26 · 4068 阅读 · 0 评论 -
C语言文件操作详解
C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现。文件操作标准库函数有: 文件的打开操作 fopen 打开一个文件 文件的关闭操作 fclose 关闭一个文件 文件的读写操作 fgetc 从文件中读取一个字符 fputc 写一个字符到文件中去 f转载 2017-11-09 15:47:47 · 244 阅读 · 0 评论 -
strlen和sizeof的区别
char str[20]="0123456789"; int a=strlen(str); /*a=10;strlen 计算字符串的长度,以\0'为字符串结束标记。 int b=sizeof(str); /*b=20;sizeof 计算的则是分配的数组str[20] 所占的内存空间的大小,不受里面存储的内容影响==================================转载 2017-12-20 22:41:20 · 135 阅读 · 0 评论 -
清屏函数 %*d 函数返回数组名 返回局部变量的引用
返回数组和返回局部变量的区别是,返回局部变量,你可以拿到这个值,而返回数组,你要拿到数组中的值,但此时栈空间已经被释放,你只是拿到了之前数组的首地址,但是值却拿不到了。所以当你要拿到值的时候,返回局部变量是可以的,但返回数组你就拿不到值了。原创 2017-12-17 21:18:22 · 202 阅读 · 0 评论 -
sscanf函数用法详解
以前一直以为sscanf只能用来简单的提取用空格隔起来的字符串,知道之前遇到了一些列字符串处理问题,详细研究起来这个函数尽然还是有很强大的有很多类似于正则表达式的功能。首先我们先来看函数定义:定义函数 int sscanf (const char *str,const char * format,........); 函数说明转载 2017-12-23 11:51:48 · 376 阅读 · 0 评论 -
c语言运算符优先级,结合性(左/右结合详解)
重新翻了遍c语言,觉得对c语言运算符结合性有必要提一下,毕竟去年我自己刚学c语言的时候,就没搞明白结合性的问题。什么是左结合?什么是右结合?它们是干嘛用的?它们是什么时候用的?本文将围绕这几个问题展开..(小白文,大神绕道)先附录几个自己学习过程中的参考网站。(有些见解和例子来自一下网站)http://wenku.baidu.com/link?url=W2o转载 2017-12-23 12:09:20 · 2561 阅读 · 0 评论 -
c语言一些常用的字符串转换函数
atof(将字符串转换成浮点型数)atoi(将字符串转换成整型数)atol(将字符串转换成长整型数)strtod(将字符串转换成浮点数)strtol(将字符串转换成长整型数)strtoul(将字符串转换成无符号长整型数)toascii(将整型数转换成合法的ASCII 码字符)toupper(将小写字母转换成大写字母)tolower(将大写字母转换成小写字母)转载 2017-12-23 12:59:23 · 1015 阅读 · 0 评论 -
取多维数组首地址的方法
#include #include int main(void){// char a[1] = {'1'};char a[1][1] = {'1'};/*char a[2][2][3] = {{{'1','2','3'},{'4','5','6'}},{{'7','8','9'},{'10','11','12'}}};*/ //对一原创 2017-12-16 18:12:00 · 1529 阅读 · 0 评论 -
递归(一)几个简单的递归例子
刚接触递归的同学,可能难以理解递归,难以理解的点可能很多,例如:1.函数为什么可以在自己的内部又调用自己呢?2.既然可以自己调用自己,那么递归运行过程中一定回有很多层相互嵌套,到底什么时候不再嵌套呢?3.递归运行过程中,相互嵌套的多层之间会有参数传递,多层之间是否会相互影响?递归两个要素1.递归边界2.递归的逻辑——递归"公式"递归的过程一定有参数的变化,并且参数的变化,和递归边界有关系.在难度较...转载 2018-04-28 15:36:44 · 1200 阅读 · 1 评论