C/C++
文章平均质量分 88
Zmyths
你和别人的不同,就是多了一点桀骜和自命不凡
展开
-
栈的实现
栈的实现,包括建栈,入栈,出栈,空栈,满栈的判断。很简单。。。原创 2016-08-18 23:36:27 · 388 阅读 · 0 评论 -
数组下标的巧用(约瑟夫环等)
最近在牛客网看到华为的笔试题,如下一题,不难,但觉得遇到好多可以巧用数组下标来存储数据的案例,觉得可以列在一起分享一下。题1:明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。原创 2017-06-24 16:54:07 · 1356 阅读 · 0 评论 -
C++中为什么有时基类的析构函数必须写为虚函数
在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。编译器总是根据类型来调用类成员函数。但是一个派生类的指针可以安全地转化为一个基类的指针。这样删除一个基类的指针的时候,C++不管这个指针指向一个 基类对象还是一个派生类的对象,调用的都是基类的析构函数而不是派生类的。如果你依赖于派生类的析构函数的代码来释放资源,而没有重载析构函数,那么会有资源泄漏。所以通常是将析构函数声明为虚函数。一个基类的函数一旦声明为虚函数,那么不管你是否加上virtual修饰符,它在所有派生类中都成为虚原创 2017-08-10 22:08:14 · 1720 阅读 · 0 评论 -
C/C++程序的内存分配
全局区(静态区)(static): 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。它是在程序编译时就已经分配好的,在整个运行期间都存在。程序结束后由系统释放 。在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放。 文字常量区 : 常量存储,常量字符串就是放在这里的。程序结束后由系统释放 。程序代码区 : 存放函数体的二进制代码。堆(heap)区:堆是用于存放进程运行中被动态分配原创 2017-04-08 23:17:33 · 4817 阅读 · 3 评论 -
递归和尾递归的区别和原理
递归和尾递归的区别和实现 基本上大多数C的入门教材里都会说简单的递归,例如求阶乘n!,经典的本科入门书籍谭浩强的《C语言程序设计》,但后来看了《代码大全2》这本书,关于进阶和编码规范的书中提到了,这些计算机教材用愚蠢的例子阶乘和斐波那契数列来讲解阶乘,因为递归是强有力的工具,但用阶乘去计算阶乘之类的,很不明智...原创 2017-08-14 00:08:07 · 46485 阅读 · 26 评论 -
char类型和short,int类型之类的转换
分析:直到尝试无符号字符型,才想起来数据的范围,char的范围是-128~127,而unsigned char的范围是0~255. 所以在做 char & short(int) 操作或者直接使用printf(“%x”,a)时,会自动补位。printf(“%x”,a)可以输出指定参数的16进制形式,但是在实际的使用中,参数不一定都是32位的整数,有可能是16位的short,8位的char。所以它们在输出%x时,会自动补位。而补位的规则就是补符号位,因为char 最大的正值为7f(127),超过就会溢出,原创 2017-04-28 10:38:06 · 24416 阅读 · 0 评论 -
TCP和UDP的详细区别
UDP与TCP的区别:UDP是不面向连接的,TCP是面向连接的,那么为什么? 首先有个信道复用的概念: 1、频分复用 2、时分复用 3、波分复用 4、码分复用 5、空分复用 6、统计复用 7、极化波复用 。不同的信道复用技术,使用不同的复用技术,目的就是创建“虚拟信道”。 一个TCP协议连接其实就是在物理线路上创建的一条“虚拟信道”。这条“虚拟信道”建立后,在TCP协议发出FIN包之前(TCP断开连接时两个终端都会向对方发送一个FIN包),是不会释放的。正原创 2017-09-09 12:04:48 · 1268 阅读 · 0 评论 -
C/C++中基本数据类型所占内存大小
C中不同数据类型所占的字节大小,在不同的操作系统和编译器下,是不同的,一般主要说gcc下,32位或64位系统的,红色部分是32 和64位系统不同的,做了个表如下:char 1 1 -128~127unsigned char(当byte使用) 1 1 0~255short int /short 2 2 –32,768~32,767unsigned short 2 2 0~65,535int 4 4 -2,147,483,648~2,147,483,647unsigned int 4原创 2017-09-11 17:49:29 · 22228 阅读 · 0 评论 -
C和C++中全局变量,局部变量,静态变量和常量
C/C++中常量,静态变量,全局变量和局部变量的区别和作用。把局部变量改变为静态局部变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态全局变量是改变了它的作用域, 限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。一旦定义了常量,就不能再去修改它的值。如果初始化没给常量赋值,那它就是一个随机数,并且以后也不能给它赋值。全局变量、静态全局变量、静态局部变量都是在静态存储区(全局数据区)中分配空间的,而局部变量是在栈上分配空间的。常量存储在常量区。全局/静态存储区,原创 2016-08-14 22:54:15 · 11831 阅读 · 2 评论 -
strcpy和memcpy的区别以及实现
strcpy和memcpy都是标准C库函数,各自的特点如下:strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容,还会复制字符串的结束符’\0’。strcpy函数的原型是:char* strcpy(char* dest, const char* src) .这里没有指定复制的长度,strcpy遇到’\0’才会结束,所以使用必须注意溢出的情况。strcpy和memcpy主要有以下3方面的区别。1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意原创 2016-11-16 19:46:34 · 951 阅读 · 0 评论 -
Linux下进程间通信的方式
Linux进程间通信的方式IPC是进程间通信的简称,是运行在某操作系统之上的不同进程间各种消息传递的方式。进程间通信的方法主要有以下几种: (1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先(父子进程关系)的进程之间进行通信。 (2)命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建原创 2017-10-11 15:00:26 · 361 阅读 · 0 评论 -
C/C++的八种排序算法及实现
几个基本常见的排序,插入排序 (包括 直接插入,希尔插入,折半插入等),交换排序(包括 冒泡排序,快速排序) ,选择排序(简单选择,堆排序,树形排序等),归并排序,基数排序(多关键字,链式基数)。原创 2016-10-08 22:43:10 · 16234 阅读 · 4 评论 -
C++中的四种类型转换
首先C中的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: Type b = (Type)a而C++中的四种转换类型如下:1.static_cast 2.const_cast 3.dynamic_cast 4.reinterpret_cast.1. static_cast <Type*> (x) 静态转换(在编译期间处理)类似于C风格的强制转换最常用的类型转换符,在正常状况下的类型转换。主要用于C++中内置的基本数据类型之间的转换.但是没有运行时类型的检测来保证转换的原创 2016-11-25 23:09:41 · 801 阅读 · 0 评论 -
C/C++中sizeof操作符的用法
sizeof是C/C++语言的一种单目操作符,它不是函数。sizeof操作符返回值为其操作数的存储大小,用字节数表示。操作数可以是一个表达式或括在括号内的类型名。 sizeof的结果是size_t,它被定义为unsigned int类型。该类型保证容纳显示所建立的最大对象的字节大小。二、Sizeof的使用 1、sizeof的使用形式:sizeof(var_name)或者sizeof var_name 2、数据类型必须用括号括起来:sizeof(int)变量名可以不用括号括住:sizeof原创 2017-05-04 16:08:34 · 2583 阅读 · 0 评论 -
C中大端小端的问题
采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。union中可以定义多个成员,但union的大小由最大的成员的大小决定。所以 union成员共享同一块大小的内存(最大的成员,且要字节对齐!),且union 的存放顺序是所有成员都从低地址开始存放。原创 2016-08-12 00:33:42 · 839 阅读 · 0 评论 -
链表中的环的问题
。环是链表中的尾结点指向前面的某一结点(可以是头结点也可以是中间的结点)。其实用 0 和 6 来形容两种环,很形象,前者尾指向头结点,后者尾指向中间结点。 一般的环相关的问题:1. 判断是否有环。利用快慢指针来判断。假设p1一次走一步,而p2一次走n(n>1)步。当p2为NULL或者p1和p2指针相同时,停止循环,进行判断,如果指针相等,则存在环。证明:这里假设p1走的距离为s,那么p2走的为n*s。如果循环结束时p2为NULL了,显然没有环;另一种循环结束情况为p1和p2相等了,也就是两指针相遇原创 2016-09-22 23:36:01 · 426 阅读 · 0 评论 -
C++开源代码项目汇总(转载分享的)
转载的,很多C/C++开源项目的网站,好东西要分享,谢谢wenrenhua08 的美文分享转载 2016-10-27 11:20:05 · 2300 阅读 · 0 评论 -
C++多线程--线程间通信与线程同步
线程的同步 :虽然多线程能给我们带来好处,但是也有不少问题需要解决。例如,对于像磁盘驱动器这样独占性系统资源,由于线程可以执行进程的任何代码段,且线程的运行是由系统调度自动完成的,具有一定的不确定性,因此就有可能出现两个线程同时对磁盘驱动器进行操作,从而出现操作错误;又例如,对于银行系统的计算机来说,可能使用一个线程来更新其用户数据库,而用另外一个线程来读取数据库以响应储户的需要,极有可能读数据库的线程读取的是未完全更新的数据库,因为可能在读的时候只有一部分数据被更新过。使隶属于同一进程的各线程协调一致地工转载 2016-10-27 17:11:42 · 18533 阅读 · 0 评论 -
C语言字符串初始化与操作
C语言中字符一般是单引号,而字符串是双引号,且字符串是以NULL(\0)结尾的零个或多个字符序列。C中没有字符串这个数据类型的,只能通字符数组或者字符指针来存储字符串变量。下面具体看看C中字符串怎么实现和操作1.字符数组的定义与初始化char str[]={" hello world!"} ;也可以去掉花括号 char str[]=" hello world!" ; 这两种是在定义的时候直接用字符串常量赋值,原创 2016-08-01 21:44:40 · 22030 阅读 · 4 评论 -
C++的多态及实现
当不同对象调用相同名称的成员函数时,可能引起不同的行为(即执行不同的代码)。这种现象称为多态性。将函数调用连接相应函数体的代码的过程称为函数联编(简称联编)。C++中根据联编时刻不同,分为静态联编和动态联编。静态联遍:不同的类可以有相同名称的成员函数,编译器在编译时对他们进行函数联编,这种在编译时刻进行的联编称为静态联编。静态联编所支持的多态性就是编译时多态性(也称编译期多态性、静态多态性)。函数重载就属于编译时多态性。动态联编:在动态联编中,在程序运行时才能确定调用哪个函数。这种在运行时的函数联编原创 2016-09-07 21:16:57 · 1148 阅读 · 0 评论 -
String类的实现
因为大家对构造函数,拷贝构造函数和赋值运算符的区别可能有点模糊,这儿很详细的给出String类的实现,另一篇博文(拷贝构造函数和赋值运算符的区别)中写了三者的区别详细。#include<iostream>using namespace std;class String{ public: String(const char* str=NULL); //普通构造...原创 2016-08-08 00:36:07 · 2248 阅读 · 6 评论 -
Windows进程间通信
1 Windows进程间通信的各种方法进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。多进程/多线程是Windows操作系统的一个基本特征。Microsoft Win32应用编程接口(Application Programming Interface, API)提供了大量支持应用程序间数据共享和交换的机制,这些机制行使的活动称为进程间通信(InterProcess Communication, IPC),进程通信就是指不同进转载 2016-11-22 14:34:50 · 444 阅读 · 0 评论 -
C/C++中的内联函数和宏定义区别
内联函数和宏的区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。(但节约时间的同时增加了空间的消耗)我们用inline来定义内联函数,在C++中,在类的声明部分定义了函数体的函数,被默认为是内联函数。而不管你是否有inline关键字。(不过编译器会决定要不要将它内联)。我们也可以将定义在类的外部原创 2016-10-26 16:52:53 · 2023 阅读 · 0 评论 -
C++中构造函数,拷贝构造函数和赋值函数的区别和实现
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法。 构造函数就是当创建一个类的对象时,它被调用来对类的数据成员进行初始化和分配内存。拷贝构造函数是一种特殊的构造函数,用基于同一类的一个对象构造和初始化另一个对象。当一个类的对象向该类的另一个对象赋值时,就会用到该类的赋值函数。拷贝构造函数是一个对象初始化一块内存区域,这块内存就是新对象的内存区,而赋值函数是对于一个已经被初始化的对象来进行赋值操作。拷贝构造函数首先是一个构造函数,它调用时候是通过参数的对象初始化产生一个对象。原创 2016-08-05 21:54:00 · 65440 阅读 · 22 评论 -
C++不同类型字符串之间的相互转换
C++中字符串的类型有,char [],char *,以及类的:String ,MFC中的Cstring,QT中的Qstring 以及字符串和整数之间的转换,他们之间的转换方法或者函数如下2. 字符串间的转化1 string to CString CString.format("%s",string.c_str()); 2 CString to stringstring str(CString.GetBuffer(str.GetLength()));3 st原创 2017-10-11 16:46:49 · 1011 阅读 · 3 评论