C语言
文章平均质量分 67
千锋教育官方
千锋立足于职业教育培训领域多年,现有教研讲师团队300余人。与国内20000余家IT相关企业建立人才输送合作关系,十年间累计培养超20余万泛IT人才,累计向互联网输出学科视频880余套,累积播放量超上亿次。
展开
-
深入理解tcp三次握手和四次挥手
起初A和B都处于CLOSED状态——B创建TCB,处于LISTEN状态,等待A请求——A创建TCB,发送连接请求(SYN=1,seq=x),进入SYN-SENT状态——B收到连接请求,向A发送确认(SYN=ACK=1,确认号ack=x+1,初始序号seq=y),进入SYN-RCVD状态——A收到B的确认后,给B发出确认(ACK=1,ack=y+1,seq=x+1),A进入ESTABLISHED状态——B收到A的确认后,进入ESTABLISHED状态。其中ACK报文是用来应答的,SYN报文是用来同步的。原创 2020-07-20 13:34:30 · 993 阅读 · 0 评论 -
C语言面试题(一)
哈喽,前几篇文章将C语言基础 简单的写了写,不知道大家能不能理解哈,今天更新下C语言的一些常见面试题,希望能帮助到大家。1、描述⼀下gcc的编译过程?gcc编译过程分为4个阶段:预处理、编译、汇编、链接。预处理:头⽂件包含、宏替换、条件编译、删除注释编译:主要进⾏词法、语法、语义分析等,检查⽆误后将预处理好的⽂件编译成汇编⽂件。汇编:将汇编⽂件转换成 ⼆进制⽬标⽂件链接:将项⽬中的各个⼆进制⽂件+所需的库+启动代码链接成可执⾏⽂件2、内存的最⼩存储单位以及内存的最⼩计量单位分别是?.原创 2020-07-20 13:34:38 · 1224 阅读 · 0 评论 -
const使用辨析
如果有这样个函数 const long CA::con_func_value() 直接返回数值而不是地址或引用,那么,据说这样没有意义;赋值函数是这样子的,好像没什么别的地方用引用返回了;另外就是只能对输入参数用const,对输出参数用了const就.......进去啥还出来啥,还调函数干啥....const类型的参数就很好理解了,就是函数内部不能修改参数的值,这只对指针和引用有效,对值传递意义不大;因为,返回值仅仅是一份临时拷贝,返回之后保存该值的临时对象就消失了,也没有谁有机会去修改它;原创 2020-07-20 13:34:46 · 1034 阅读 · 0 评论 -
C语言面试题(三)
接着更新C语言面试题,希望能帮助到大家!(1) 反转一个链表。(2) 反转一个链表。原创 2020-07-21 13:25:58 · 1098 阅读 · 1 评论 -
Linux系统编程:信号捕捉
正确的做法是,在执行回调函数期间,使用sa_mask临时的去替代进程的阻塞信号集,保证回调函数安心的执行完毕,再解除替代。假如说,这个回调函数回调执行的时间比较长,比如2秒,在这2秒里,又有其它的信号过来,那进程是暂停当前回调函数,去响应新的信号,还是不管新来的信号,先把当前回调函数处理完再说?另外,阻塞的常规信号不支持排队,也就是说,执行回调函数期间,再来千百个同个信号时,系统只记录一次。信号的捕捉,说白了就是抓到一个信号后,执行我们指定的函数,或者执行我们指定的动作。:通常设置为0,表示使用默认属性。原创 2020-10-21 14:03:04 · 256 阅读 · 0 评论 -
【Postman】12 Postman monitor功能使用
通过前面的文章,我们已经能完成接口的Collection,添加断言,Data文件数据驱动,设置变量(Data、Globals和Environment)等等方法,对我们的接口进行个各种的测试,保证其正确性。但是还可能有这么一个场景,突然某一天用户反应说我们的网站访问不了了,这时候,那帮程序猿查日志的查日志,看数据库的看数据库,当找到原因的时候,系统已经是发布上线后的几个小时啦,这对用户体验来说是很不好的。那我们能不能对接口做一个监控呢?如果接口有问题,给对应的程序猿发个邮件通知,这样我们就能做到在客户原创 2020-08-06 14:14:35 · 694 阅读 · 1 评论 -
C语言最新面试题系列二
好的嵌入式程序员非常准确地明白硬件的细节和它的局限,然而PC机程序往往把硬件作为一个无法避免的烦恼。10、这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换为一指针是合法的。12、这个问题测试你是否懂得C语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。13、对于一个int型不是16位的处理器为说,上面的代码是不正确的。14、 这里,我期望应试者能提到内存碎片,碎片收集的问题,变量的持行时间等等。16、 这个问题将做为这个测验的一个愉快的结尾。9、对这个问题有三种基本的反应。原创 2020-08-05 13:42:31 · 797 阅读 · 1 评论 -
C语言最新面试题系列三
4、二维字符数组:char a[][] = { "abcde";一维字符指针数组:char *b[] = {"abcde";6、致命错误主要包括启动配置错、内部资源耗尽和各种其它类型的不可恢复性错误。7、pp是指向结构AA的指针,定义为struct AA *pp;qq是结构AA类型的变量,定义为 struct AA qq;1、第一题的答案应该是4^3-1=63。2、设2个栈为A,B, 一开始均为空.3、函数名: atol。原创 2020-08-05 13:42:22 · 764 阅读 · 1 评论 -
C语言学习路线图
C 语言简洁、紧凑、使用方便灵活加上 GNU 在实际项目开发中所做的扩展,使得 C 语言在整个嵌入式开发过程中起着至关重要的作用。更重要的是用 C 语言开发的程序在嵌入式平台下可移植性比较强,运行效率极高。一个精通 C 语言程序设计的程序员,可以很容易地从事 Linux、WinCE、Vxworks、μc/os 等嵌入式操作系统下的各类软件开发工作。本阶段学习目标是掌握C 语言基本知识、巩固 C 编程语法基础 , 以及深入 C 语言高级编程和数据结构与算法,为将来的程序设计工作打下坚实的基础。原创 2020-08-05 13:42:04 · 878 阅读 · 1 评论 -
C语言最新面试题系列之c语言内存问题
这可以说是一个内存分配和释放的原则,比如说上面解决办法的第二种,由itoa()分配的内存,最后由调用者释放,就不是一个很好的办法,还不如用第三种,由调用者自己申请和释放。另外这个原则还有一层意思是说:如果你要使用一个指针,最好先确信它已经指向合法内存区了,如果没有就得自己分配,要不就是非法指针访问。很多程序的致命错误都是访问一个没有指向合法内存区的指针,这也包括空指针。我使用sizeof来计算一个指针变量,我希望得到这个指针变量所分配的内存块的大小,可以吗?我想尽可能地避免内存使用上的问题,有什么捷径吗?原创 2020-08-05 13:41:56 · 893 阅读 · 1 评论 -
C语言最新面试题系列之c语言底层操作问题
操作符把它们的操作数当作"真"或"假",并且用 0 代表"假",任何非 0 值被认为是"真"。它们返回 1 代表"真",0 代表"假",对于"&&"和"||"操作符,如果左侧的操作数的值就可以决定表达式的值,它们根本就不去计算右侧的操作数。C语言的内存模型基本上对应了现在von Neumann(冯·诺伊曼)计算机的实际存储模型,很好的达到了对机器的映射,这是C/C++适合做底层开发的主要原因,另外,C语言适合做底层开发还有另外一个原因,那就是C语言对底层操作做了很多的的支持,提供了很多比较底层的功能。原创 2020-08-05 13:41:41 · 721 阅读 · 1 评论 -
面试挖坑题系列—第一季
A.都不行 B.都可以 C.只有构造函数可以 D.只有析构函数可以。A.浅层复制:只复制指向对象的指针,而不复制引用对象本身。C.如果是浅复制,修改一个对象可能会影响另外一个对象。D.如果是深拷贝,修改一个对象不会影响到另外一个对象。B.深层复制:复制引用对象本身。程序的输出结果是()(3)答案:ABCD。(7)答案:ABCD。原创 2020-08-04 10:06:24 · 866 阅读 · 1 评论 -
一文带你了解static 和const
const 是c++中常用的类型修饰符,许多人使用它仅仅是想当然,这样,有时也会用对,但在某些微妙的场合,可就没那么幸运了,究其实质原由,大多因为没有搞清本源。分析:上述写法限定函数的返回值不可被更新,当函数返回内部的类型时(如fun1),已经是一个数值,当然不可被赋值更新,所以,此时const无意义,最好去掉,以免困惑。1. 大家知道,c++有一个类型严格的编译系统,这使得c++程序的错误在编译阶段即可发现许多,从而使得出错率大为减少,因此,也成为了c++与c相比,有着突出优点的一个方面。原创 2020-08-04 10:06:15 · 724 阅读 · 1 评论 -
解锁GitHub(6)之高效使用Github寻找开源项目并学习
分享一下个人经验总结,就是硬着头皮,逐个函数、逐个文件的理解过去,遇到不懂的就google,懂了的就在旁边写上注释,碰到复杂逻辑,拿出草稿纸画流程图,从函数、文件到模块,最后慢慢能复述出大致的逻辑和经典的细节。说白了,没有看不懂的代码,只有不够强的动力。原创 2020-08-04 10:06:01 · 927 阅读 · 1 评论 -
解锁GitHub(5)之GitHub本地仓库使用
目录:一、上传文件 二、搜索仓库文件 三、下载/检出项目四、Github Issues使用五、收藏功能 五、关注功能六、fork功能原创 2020-08-04 10:05:53 · 793 阅读 · 1 评论 -
解锁GitHub(4)之GitHub注册和介绍
前边几篇文章简单介绍了一下git,今天补充GitHub的注册使用。注册完成后,选择个人Free免费账号,完成设置。按照要求输入账号、邮箱、密码注册就好。注意:如需验证邮箱,点击验证即可。两种方式:一是点击左上角。原创 2020-08-04 10:04:11 · 802 阅读 · 2 评论 -
详解数组的下标
提到数组,我想你肯定不陌生,甚至还会自信地说,它很简单啊。是的,在每一种编程语言中,基本都会有数组这种数据类型。不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构。尽管数组看起来非常基础、简单,但是我估计很多人都并没有理解这个基础数据结构的精髓。在大部分编程语言中,数组都是从 0 开始编号的,但你是否下意识地想过,为什么数组要从 0 开始编号,而不是从 1 开始呢? 从 1 开始不是更符合人类的思维习惯吗?你可以带着这个问题来学习接下来的内容。如何实现随机访问?什么是数组?我估计你心中已经有原创 2020-08-03 10:54:14 · 3865 阅读 · 1 评论 -
不同编程语言的魅力
Visual Basic是一种由微软公司开发的结构化的、模块化的、面向对象的、包含协助开发环境的事件驱动为机制的可视化程序设计语言。它源自于BASIC编程语言。C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。一般,“Perl”,有大写的P,是指语言本身,而“perl”,小写的p,是指程序运行的解释器。最重要的是,C#使得C++程序员可以高效的开发程序,而绝不损失C/C++原有的强大的功能。原创 2020-08-03 10:53:54 · 789 阅读 · 0 评论 -
解锁GitHub(1)git和GitHub关系
先从概念上理解gitgithub用一句话形容这二者的关系:git是弓,你的代码是箭,github是靶子。总结来说,git可以认为是一个软件,能够帮你更好的写程序,github则是一个网站,这个网站可以帮助程序员之间互相交流和学习。原创 2020-08-03 10:53:45 · 788 阅读 · 0 评论 -
解锁GitHub(2)git工具的安装与配置
在Windows上使用Git,可以从Git官网直接下载安装程序。配置文件是:当前项目下的 ./.git/config。配置完成后,接下来,就可以学习git工具的使用了。配置文件是:/etc/gitconfig、(1)系统中所有的用户都可以使用该配置。配置文件是:~/.gitconfig。在liunx上的安装仅需要一条命令。(4)查看当前所有的配置信息。,然后按默认选项安装即可。(2)当前用户可使用该配置。(3)当前项目可使用该配置。原创 2020-08-03 10:53:36 · 773 阅读 · 0 评论 -
解锁GitHub(3)git工具的使用 涛哥
先用a修改file1.c,保存到临时工作区,先用b修改file1.c,保存到临时工作区,查看所有的临时工作区、用指定的临时工作区代替当前工作区。(1)初始化仓库(在某个目录下初始化仓库后会自动产生.git目录,改目录下工作的所有文档可使用git进行管理)从当前工作区到暂存区,在到本地仓库、指定删除哪个临时工作区、删除所有的临时工作区。原有主机上本来是由一个本地仓库的,现在新建远程仓库。(6)比本地文件和本地仓库中文件的区别。(4)将暂存区的文件提交到本地仓库。删除本地工作区文件和本地仓库文件。原创 2020-08-03 10:53:25 · 853 阅读 · 0 评论 -
如何用c语言和GTK写一个扔色子的程序?
今来写一个简单版本的扔色子的程序。如果只用C语言来写,就随机数就可以了,现在加上了图形界面,代码如下:#include <gtk/gtk.h>#include <time.h>static GtkWidget *ourgif;gint i = 0;int flag=0;void change_bmp(){ srand(time(NULL)); i = rand() % 6; //取值范围是0~5 if(flag==0){ g_print("flag=原创 2020-07-31 09:37:49 · 920 阅读 · 1 评论 -
gtk当中一些好玩的小例子
方法2:参考本人上一篇文章。原创 2020-07-31 09:37:37 · 945 阅读 · 1 评论 -
详解c++中字符指针数组的使用
指针数组,就指向指针的指针,很早以前在说指针的时候说过,但后来发现很多人还是比较难以理解,这一次我们再次仔细说一说指向指针的指针。先看下面的代码,注意看代码中的注解:#include <iostream> #include <string> using namespace std; void print_char(char* array[],int len);//函数原形声明 void main(void) { //---------原创 2020-07-31 09:37:28 · 956 阅读 · 1 评论 -
线程间同步互斥(4)信号量使用
接下来。来看一看信号量的使用。概念部分:信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于 0 时,则可以访问,否则将阻塞。PV 原语是对信号量的操作,一次 P 操作使信号量减1,一次 V 操作使信号量加1。函数接口部分:#include <semaphore.h>// 初始化信号量int sem_init(sem_t *sem, int原创 2020-07-31 09:37:12 · 915 阅读 · 1 评论 -
const修饰指针和引用释疑
中,pi的类型为int*,而&a的类型为const int* const,只要其中含有int* 就可以。//将const pi看作一体,就与(2)所述相同,只是要求pi必须为const,正如上所说,=号两边的类型不必严格匹配,但必须含有int*, &a的类型为const int* const,含有int*, 所以可以赋值。去掉ri左边的&号,则为int *const ri,因为ri是别名,故ri的类型应与赋值的数类型一致,ri类型为int *const,&i为int *const,可以这么做.原创 2020-07-30 10:05:48 · 1034 阅读 · 1 评论 -
文件传输软件WinSCP的使用
WinSCP软件是windows下的一款使用ssh协议的开源图形化SFTP客户端,也就是一个文件传输的软件,它有什么优点吗?咱们嵌入式开发中经常会将windows中的文件复制到linux系统当中,比较常用的方式就是添加共享文件夹,每次通过添加的共享文件夹来相互传输文件,这里介绍的是一款能够跨系统使用的文件传输软件。软件的安装很简单,与其他软件一样直接安装即可,一直下一步就可以,当安装完软件后,打开软件,会看到一下界面此时,它会让你输入一些信息,主机名就是当前linux用户的IP地址,注意原创 2020-07-30 10:05:39 · 1862 阅读 · 1 评论 -
纯C语言实现bootloader
之前有用很少一部分汇编实现过bootloader,但经过后来慢慢改进,发现是可以用纯C语言实现嵌入式操作系统的引导。下面是之前对不能完全使用C语言引导系统的几点说明:1、C程序中所有的代码都是以函数的形式出现,而函数定义通常会用到参数和在函数里面定义一堆局部变量,而这些变量一旦过多时,寄存器就无法全部保存,此时就会将剩下的变量存到堆栈里面,即,SP寄存器所指向的内存里面,而此时的SP寄存器并未赋初值,也就没有确切的内存地址可用。所以需要用到堆栈的前提是SP堆栈指针已经有了明确指向,否则就是非法访问内原创 2020-07-30 10:05:23 · 1054 阅读 · 1 评论 -
线程间同步互斥(2)读写锁使用
概念:允许多个读出,但只允许一个写入的需求。读写锁与互斥量类似,不过读写锁允许更改的并行性,也叫共享互斥锁。互斥量要么是锁住状态,要么就是不加锁状态,而且一次只有一个线程可以对其加锁。读写锁可以有3种状态:读模式下加锁状态、写模式加锁状态、不加锁状态。读写锁使用步骤:1、定义:pthread_rwlock_t rwlock;2、初始化:3、上锁3.1申请读锁3.2申请写锁4、解锁5、销毁读写锁例子:要实现的功能是验证通过读写锁实现,读线程原创 2020-07-30 10:04:55 · 972 阅读 · 1 评论 -
利用c++实现的贪吃蛇游戏
在tc 3.0下调试通过,因为tc 3.0不支持bool 类型,所以程序中自定义了个枚举类型变量bool。如果在vc或者bc中运行,可以把这个bool类型注释掉.原创 2020-07-29 10:27:37 · 1531 阅读 · 2 评论 -
数据结构之队列的顺序存储以及实现
之前咱们已经学习了数据结构的最基本的线性表的顺序存储和链式存储,以及线性表中经常使用的栈的顺序存储和链式存储,今天咱们主要学习的是队列的顺序存储,注意的地方是,队列也是线性表的一种,所以也是一对一的存在,在使用过程中,一定要主要它的特点。接下来,咱们就来看一下主要内容。1. 定义队列是限制在两端进行插入操作和删除操作的线性表,允许进行存入操作的一端称为“队尾”,允许进行删除操作的一端称为“队头”。当线性表中没有元素时,称为“空队”。2. 特点先进先出(FIFO)。3. 队列的定义(1原创 2020-07-29 10:22:40 · 1200 阅读 · 1 评论 -
数据结构之栈的链式存储以及实现
对于栈的链式存储,其实咱们之前已经给大家分享过了,其实栈的链式存储和单链表(线性表的链式存储)是一样的,但是栈符合的特性是后进先出,所以需要考虑的是如何实现出栈和入栈。那么通过之前的学习,相信大家应该知道了,其实入栈和出栈就相当于单链表的头插法和头删法,这样实现的话就简单多了,具体代码如下。插入操作和删除操作均在链表头部进行,链表尾部就是栈底,栈顶指针就是头指针。(1)定义栈节点 linkstack_t(2)创建一个空的栈 linkstack_create( )(3)入栈 links原创 2020-07-29 10:22:29 · 928 阅读 · 1 评论 -
Const的几大用法(常用)
Const实际上是函数参数的一部分,在第一个成员函数中它限制这个函数不能改变对象的数据,而第二个则没有。声明成员函数时,末尾加const修饰,表示在成员函数内不得改变该对象的任何数据。也就是说指针指向的内存地址不可变,但可以随意改变该地址指向的内存的内容。在第一个例子中,const用来修饰指针j,j不可变(也就是指向int变量的常指针);第二个例子中,const用来修饰*j,*j不可变(也就是指向int常量的指针)。const也可用来限制指针指向的内存不可变,但指针指向的内存地址可变。原创 2020-07-29 10:22:23 · 1051 阅读 · 1 评论 -
堆和栈的区别(经典版)
这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。原创 2020-07-29 10:22:09 · 974 阅读 · 1 评论 -
常用排序算法(c语言篇)
最近重新回顾了一下数据结构和算法的一些基本知识,简单整理下C语言下的常见排序算法。选择排序selectSort选择排序是最简单的一种基于O(n2)时间复杂度的排序算法,基本思想是从i=0位置开始到i=n-1每次通过内循环找出i位置到n-1位置的最小(大)值void selectSort(int arr[], int n){ int i, j , minValue, tmp; for(i = 0; i < n-1; i++) { minValue原创 2020-07-28 13:46:39 · 893 阅读 · 0 评论 -
C++引用之给已有的变量取个别名
1、引用的概述引用是c++对c的重要扩充。在c/c++中指针的作用基本都是一样的,但是c++增加了另外一种给函数传递地址的途径,这就是按引用传递(pass-by-reference),它也存在于其他一些编程语言中,并不是c++的发明。变量名实质上是一段连续内存空间的别名,是一个标号(门牌号) 程序中通过变量来申请并命名内存空间 通过变量的名字可以使用存储空间对一段连续的内存空间只能取一个别名吗? c++中新增了引用的概念,引用可以作为一个已定义变量的别名。 基本语法: Type& .原创 2020-07-28 13:44:16 · 1097 阅读 · 0 评论 -
c++中的动态数组使用
C++的new操作符是该语言一个非常好的语法特性,然而实际使用中却发现new操作符有不少限制,为突出的一点便是用new操作符分配多维数组空间时,不能让数组的每一维都动态可变。本文将对此提出一个简单直观的解决方案,在一个实际问题的简化模型中加以说明,并以此释清许多初学者对C++中new操作符与多维数组的误区。1. 问题的提出--多维可变数组的实际用途 下面是实际编程中遇到问题的一个简化模型。ChessBoard是一个棋盘类,其中的m_board是用来保存棋盘上棋子信息的二维数组。DIMENSION是原创 2020-07-28 13:43:37 · 1017 阅读 · 0 评论 -
C++引用之用法详解
引用的本质在c++内部实现是一个指针常量. Type& ref = val;c++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同,只是这个过程是编译器内部实现,用户不可见。那么函数的返回值类型必须是。给函数的返回值 取个别名。原创 2020-07-27 13:28:08 · 952 阅读 · 0 评论 -
代码编写小窍门(解决复制粘贴带行号问题)
大家在初学编程的 时候,经常会从网上复制部分代码,但偶尔复制的情况不尽如人意,比如下边这种情况: 1 #include<stdio.h> 2 #include<signal.h> 3 #include<unistd.h> 4 #include<stdlib.h> 5 #include<fcntl.h>原创 2020-07-27 13:28:00 · 1083 阅读 · 0 评论 -
守护进程的创建
由于在调用fork函数的时候,子进程拷贝了父进程的会话期,进程组,控制终端等,虽然父进程退出了但是会话期,进程组,控制终端没有改变,因此还不是真正意义上独立了。在linux中父进程先与子进程退出会造成孤儿进程,每当发现一个孤儿进程 时就会自动由1号进程(init)收养它,这样原先的子进程就会变成init的子进程。进程组:一个或多个进程的集合,进程组由进程组的ID来唯一标示 ,每个进程组都有一个组长进程,其组长进程的进程号等于进程组ID,该进程组ID不会因为组长进程退出而受到影响。原创 2020-07-27 13:27:43 · 923 阅读 · 0 评论