C/C++
C-Jonn
python
Keep calm and carry on!
展开
-
结构体成员的对齐方式
我们都知道每种数据类型占有的内存空间大小都是明确,比如:char类型占一个字节,int类型占4个字节等等。我们可以通过使用sizeof关键字得到各种数据类型的长度:例如:sizeof(char);//占1个字节 sizeof(int); //占4个字节 sizeof(short); //占2个字节sizeof(double); //占8个字节 对于结构体来说,结构体也是一种...原创 2017-04-01 20:30:45 · 2335 阅读 · 0 评论 -
有关重载和覆写的说明
1、重载和覆写之间的区别:重载(overriding)是指子类改写父类的方法,重载可以有函数重载和运算符重载。覆写(overloading)是指同一个函数的不同版本之间参数不同。(1)重载重载是编写一个与已有函数同名但参数列表不同(参数类型或参数个数不同)的方法,具有以下特征:方法名必须相同参数列表必须不同,与参数列表的顺序无关返回值类型可以不同,但就两个函数的返回值而原创 2017-08-21 10:38:06 · 1870 阅读 · 2 评论 -
关于复制构造函数赋值函数
一、复制构造函数1、 可以用类对象初始化另一个对象,默认是通过依次复制每个非静态数据成员来实现的,也可以通过提供特殊的复制构造函数(copy constructor )来改变默认行为。复制构造函数是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构造及初始化。如果在类中没有显式的声明一个复制构造函数,那么,编译器会私下里制定一个函数来进行对象之间的位复制(bitw原创 2017-08-20 11:12:50 · 367 阅读 · 0 评论 -
C++中的四种运算符转化及不同点:
C++中的四种运算符转化及不同点:(1)const_cast操作符:即工程设计师在特殊情况下将限制为const成员函数的const定义解除,使其可以更改特定属性。(2)dynamic_cast操作符:如果启动了支持运行时间类型信息(RTTI),dynamic_cast有助于判断在运行时所指向对象的确定类型。它与typeid运算符有关,可以将一个基类的指针指向不同的子类型原创 2017-08-14 22:14:36 · 378 阅读 · 0 评论 -
编程实现strcat
库函数strcat把字符串内容连接到目标字符串的后面,所以应该从目标字符串的末尾也就是结束符"\0"的位置开始插入另一个字符串的内容函数原型:char *strcat( char *strDestination, const char *strSource );#include#includechar *MyStrcat( char *Des, const char *Src ){原创 2017-08-12 21:00:56 · 667 阅读 · 0 评论 -
在字符串上插入字符统计的个数
//在字符串中,插入字符统计的个数。例如字符串ggggkksd//插入字符统计的个数后为:gggg4kk2s1d1#include using namespace std;#define MAXCOUNT 2*100char *transformation(char *str){ if(str==NULL) return NULL; int len=strlen(str);原创 2017-08-12 20:05:04 · 341 阅读 · 0 评论 -
C++ 从指定位置开始,删除指定长度的字符串
1:先检查指定位置和指定长度的合法性;2:找到指定位置;3:删除指定长度个字符串。具体代码如下:#include using namespace std;char *GetCharsDeleted(char *str,int pos,int len){ char *p=str+pos-1; int i=0; char *temp=NULL; int ls=strle原创 2017-08-11 23:26:55 · 2367 阅读 · 0 评论 -
字符串循环右移
实现字符串循环右移指定位数;思路:1、首先计算字符串尾部移到头部的字符个数;2、分配一个相同大小的堆内存来临时保存这些字符;3、做循环将头部字符移到尾部;4、做第二次循环将堆内存中的字符复制到字符串头部。具体代码如下:#include using namespace std;void loopMove(char *str,int n){ char *tem原创 2017-08-11 21:37:12 · 682 阅读 · 0 评论 -
任意长度数字的加法
在C/C++中用int,float,double等类型表示数字,但是它们长度都是有限的。如果要求数字是任意长度,则可以用字符串表示数字,同样也用字符串表示结果。代码如下:#include #include #include #include using namespace std;char *addBigInt(char *num1,char *num2){ int c=0原创 2017-08-11 20:44:24 · 645 阅读 · 0 评论 -
实现字符串反转
#include using namespace std;//方法一:通过数组下标访问字符串char *MyStrrev1(const char *str){ if(str==NULL) return NULL; int len=strlen(str); char *tmp=new char[len+1]; strcpy(tmp,str); for(int i=0;i<l原创 2017-08-11 11:27:47 · 240 阅读 · 0 评论 -
实现自己的strcpy和memcpy
实现自己的strcpy和memcpy(1)实现自己的strcpystrcpy 函数提供了字符串复制。即strcpy只用于字符串复制,并且它不仅复制字符串的内容,还会复制字符串的结束符。strcpy函数原型是: char* strcpy(char *strDest,const char *strSrc);代码如下:#include #include using n原创 2017-08-10 22:59:42 · 353 阅读 · 0 评论 -
指针与句柄的区别
指针与句柄的区别:1、什么是句柄?句柄在Windows编程中是一个很重要的概念,在很多程序中都扮演者重要的角色。在Windows环境中,句柄是用来标识项目的,这些项目包括:模块,任务,实例,文件,内存块,菜单,控制,字体,资源(包括图标,光标,字符串等),GDI对象(包括位图,画刷,元文件,调色板,画笔,区域以及设备描述表)。Windows是以虚拟内存为基础的操作系原创 2017-08-10 22:55:55 · 553 阅读 · 0 评论 -
malloc、calloc、realloc、free
动态内存的传递C语言的标准内存分配函数有malloc、calloc、realloc、free等:1、malloc调用形式为(类型*)malloc(size)。在内存的动态存储区中分配长度为“size”字节的连续区域,返回该区域的首地址,此时内存中的值没有初始化,是一个随机值。2、calloc 调用形式为(类型*)calloc(n,size)。在内存的动态存储区中分配n块原创 2017-08-10 22:52:36 · 284 阅读 · 0 评论 -
引用和指针的区别
1、指针和引用在编写方法完全不同,指针使用操作符*和->,引用使用操作符&;2、初始化要求不同。引用在创建的同时必须初始化,而指针在定义的时候不必初始化,可以再定义后面的任何地方重新赋值;3、可修改性不同。引用一旦被初始化,它就不能被另一个对象引用;而指针在任何时候都可以指向另一个对象;4、不存在NULL引用。引用不能使用指向空值的引用,它必须指向某个对象;而指针可以是NULL,原创 2017-08-10 20:59:42 · 216 阅读 · 0 评论 -
sizeof与strlen的区别(后附sizeof的用途)
1、sizeof是运算符,strlen是函数2、sizeof操作符的结果是size_t,它的头文件中typedef为unsigned int类型,该类型保证能容纳实现所建立的最大对象的字节大小。3、sizeof可以用类型做参数,strlen只能用char*做参数,且必须以“\0”结尾;4、数组作为sizeof的参数不退化,但是传递给strlen时就退化为指针了。5、大部分编译程原创 2017-08-10 20:56:54 · 247 阅读 · 0 评论 -
计算含有汉字的字符串的长度
计算含有汉字的字符串长度,汉字作为一个字符处理已知汉字编码为双字节,其中首字节实现代码如下:#include using namespace std;int My_strlen(const char*str){ if(str==NULL)//检查str 的有效性 { return NULL; } const char *p=str;//用于后面遍历 while(*原创 2017-08-12 21:24:59 · 1842 阅读 · 0 评论 -
实现字符串中各单词翻转
代码一:1、将字符串中的所有单词翻转,例如:src中的字符串为“I am from Beijing”,翻转后为 "I ma morf gnijieB"2、再进行全局翻转"Beijing from am I"#include using namespace std;void RevStr( char *src){ if (src==NULL) return ; //1原创 2017-08-11 11:37:04 · 949 阅读 · 0 评论 -
纯虚函数和抽象基类
纯虚函数就是基类只定义了函数体,没有具体的实现过程,必须在子类中加以实现。如果基类中含有一个或多个纯虚函数,那么它就属于抽象基类,不能被实例化。 1、 引入抽象基类和纯虚函数的原因有以下两点:(1)为了方便的是使用多态特性;(2)在很多情况下,基类本身生成对象是不合情理的。抽象基类不能够被实例化,它定义的纯虚函数相当于接口,能把派生类的共同行为提取出来。2、虚函数和纯虚函数原创 2017-08-25 11:04:52 · 452 阅读 · 0 评论 -
排序之交换排序:冒泡排序and快速排序
交换排序基本思想:两两比较待排序记录的关键字,发现两个记录次序相反时即进行交换,直至没有反序记录为止。分类:冒泡排序和快速排序。1、冒泡排序:冒泡排序大家都比较熟悉,所以这里不具体说明,请看代码:void bubble_sort1(int a[],int len)//冒泡排序{ for(int i=0;i<len-1;i++) { for(int j=len-1;j>i原创 2017-09-03 10:51:02 · 250 阅读 · 0 评论 -
排序之插入排序
基本思想:每次将一个待排序的记录,按其关键字大小插入到前边已经排好序的子数组中的适当位置,知道全部记录插入完成为止。分类:直接插入排序和希尔(shell)排序。一、直接插入排序:基本操作:将当前无序区的第一个记录R[i]插入到有序区R[1....i-1]中适当的位置,使得R[1...i]变为新的有序区。每次使有序区增加1个记录,也称为增量法。可分解为以下步骤:(1)在当前有序区原创 2017-09-03 09:50:01 · 214 阅读 · 0 评论 -
初始化string对象时,申请空间的秘密
string对象的初始化系统申请的空间依编译器的不同而不同:1、对VS来说,当我们需要申请的空间小于15时,系统每次默认分配15个字符空间;当需要申请的字符空间大于15时,系统会多余分配16个字符空间,,在随后的每次溢出,即每次需要的申请大于15时,分配的空间将增加16个。假设我们需要申请的字符空间呢是x,系统为我们分配的为y:(1)、x(2)、 15(3)、31以此类推原创 2017-03-31 15:19:43 · 2377 阅读 · 0 评论 -
指针数组与数组指针的那些事
我们先来看下指针数组和数组指针的定义:指针数组:数据类型 *数组名[元素个数]; 如:int *a[10]; a表示一个含有10个指向int类型的指针元素的数组;数组指针:数据类型 (*数组名)[元素个数]; 如: int (*a)[5]; a表示一个指向含有5个int类型元素数组的指针;本质区别:指针数组 本质上是一个数组,只是数组中的元素均为原创 2017-03-30 17:08:54 · 263 阅读 · 0 评论 -
访问数组时的细节
在访问数组时,可能会造成数组越界访问,所以一个良好的编程习惯是很重要的,主要有以下两个注意点:1、数组不是作为函数参数访问时,直接检查数组元素的个数例如:#include using namespace std; int main() { int a[10]={0};for(int i=0;i{a[i]=i;c原创 2017-03-29 22:44:57 · 612 阅读 · 0 评论 -
C++中的常量问题
在C++中,常量可以通过两种方式来定义:1、在声明或定义变量之前用const;2、通过宏定义,也就是#define例如:将pi定义为常量,const float pi=3.14;或 #define pi 3.14 接下来,讨论下const和#define之间的区别:1、define只能用来做文本宏替换,define的生命周期在编译器就会结束,存在于程序的代码转载 2017-03-28 20:52:43 · 334 阅读 · 0 评论 -
求1+2+3+...+n你真的做的到吗?
有这样一道C/C++题:求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。还有多少种解法?对于这个问题限制了我们常用的求解方式,目的是想让我们另辟蹊径。那么我们只有硬着头皮找各种方式来应对此题,下面为大家带来几个来自网友们的方法,供我们共同学习:1、利用了&&的短路特性:即当&&(与)的左边为假时整原创 2017-05-17 20:26:12 · 555 阅读 · 0 评论 -
单链表的正向排序,反向排序
#include using namespace std;#include struct Node {int data;Node *next;};Node *InsertSort_List(void){int data=0;Node *head=NULL;Node *NewNode,*CurNode,*PreNode;wh原创 2017-05-27 16:07:54 · 2254 阅读 · 0 评论 -
单链表的创建,表长,插入,查找,逆置,中间元素,删除节点,打印
直接上代码。。。#include#include using namespace std;struct Node{int data;Node *next;};/* typedef struct Node{int data;Node *next;}Node;*/Node *create(){int i=0;//链原创 2017-05-27 15:15:27 · 416 阅读 · 0 评论 -
冒泡排序法
冒泡排序程序实现如下:#include using namespace std;#define N 10int main(){int a[N]={0};for(int i=0;icin>>a[i];for(i=0;i{for(int j=N;j-i>0;j--)//确定M个气泡中最轻气泡if(a[i]>a[j-1]){int原创 2017-03-30 10:29:25 · 232 阅读 · 0 评论 -
判断单链表中是否存在回环
判断单链表是否存在回环原理很简单,即假设有两个指针p1,p2。在每次循环的时候,p1先走一步,p2走两步,直到p2碰到空指针或两者相等时循环结束,如果两个指针相等则说明存在回环。具体代码如下:(仅供参考)#include using namespace std;#include struct Node{ int data; Node *next;};Node *cre原创 2017-06-02 15:16:33 · 3060 阅读 · 0 评论 -
有序单链表的合并:递归和非递归方法
已知有两个有序的单链表head1和head2。分别使用递归方法和非递归的方法合并成一个有序的单链表。1:递归方法。假设两个链表:1->3->5;2->4->6.递归的步骤如下:(1) 比较链表一和链表2的第一个数据节点,由于1(2) 对剩余的链表1和链表2再调用(1)过程,比较得到结果链表的第2个节点,即2与3比较得到2。此时合并的链表节点为1->2.(3) 递归直到两个链原创 2017-06-02 17:00:42 · 491 阅读 · 0 评论 -
约瑟夫问题——循环链表C++
什么是约瑟夫问题?约瑟夫问题是一个有名的问题,编号为1-N的N个人安顺时针围坐一圈,选取M为报数的上限,从第一个人按顺时针开始报数,将第M个人出列,,下一个人继续从1开始报数,报到M的人再出列,直至所有的人全部出列为止。循环链表:循环链表与单链表一样,是一种链式的存储结构。区别在于循环链表的最后一个节点的指针指向该循环链表的第一个节点或头结点,从而形成一个环。在建立一个原创 2017-06-03 10:11:12 · 7622 阅读 · 0 评论 -
计算二进制中1的个数
1、我们先看一下,下边这个函数的返回值是多少?这里假定x=9999;int func(x) { int countx = 0; while (x) { countx ++; x = x & (x - 1); } return countx; }有没有一种看起来很简单,整个计算的过程也很清晰,但是我们在原创 2017-06-04 09:34:52 · 944 阅读 · 0 评论 -
C/C++中的野指针
1、野指针不是NULL指针,而是指向“垃圾”内存的指针。人们一般不会错用NULL指针,但是“野指针”是很难判断出是很危险的,而且if语句对它不起任何作用。“野指针”的成因主要有两种:(1)指针变量没有初始化。任何指针变量刚被创建时不会自动自动成为NULL指针,它的默认值是随机的,所以,指针变量在创建的同时应当初始化,要么将指针设置成为NULL,要么指向合法的内存。(2)指针原创 2017-08-10 20:50:56 · 310 阅读 · 0 评论 -
内联函数与宏定义
inline(内联函数)是C++中引入的机制,其目的是解决使用宏定义的一些缺点。1、为什么要引入内联函数引入内联函数的主要目的是用来替代C中表达式形式的宏定义,解决程序中函数调用的效率问题。由于宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等一系列的操作,因此效率很高。由于宏定义在使用时只是做预处理器符号表中的简单替换,因此不能进行参数有效性的检原创 2017-08-10 20:53:13 · 640 阅读 · 0 评论 -
静态存储区、栈、堆的内存分配
静态存储区、栈、堆的内存分配:1、从静态存储区域分配内存。程序编译的时候内存已经分配好了,并在程序的整个运行期间都存在,例如全局变量。2、在栈上创建。在执行函数时,函数内局部变量的存储单元可以在栈上创建,函数结束时,这些存储单元自动被释放。处理器的指定集中有关于栈内存的分配运算,因此效率很高,但是分配的内存容量有限。3、从堆上分配内存,亦称动态内存分配。程序在运行时用mal原创 2017-08-10 22:54:46 · 544 阅读 · 0 评论 -
const 和 static的用法及作用
const:1、类中某个数据成员是const,表示这个数据成员不能被世界修改,但是可以间接修改,并且数据成员是不允许在雷利定义时初始化,必须在构造函数的初始化列表中进行初始化。2、函数成员的参数通常是使用引用的,表示用的是源头的数据;如果不希望破坏数据,则需要定义成const。通常情况下,函数成员的参数const和引用联合使用,以保证数据不被破坏;3、(1)常量成员函数 :const原创 2017-04-02 20:44:33 · 1359 阅读 · 0 评论 -
获取两个字符串中最大的公共子串
#include using namespace std;//此程序中可以用strsub,也可以用库函数strstr实现在字符串中匹配子串//strsub是我们自己实现的在字符串中查找子串;/*const char* strsub(const char *src,const char *sub){ const char *bp; const char *sp; if(src==原创 2017-08-12 19:58:47 · 455 阅读 · 0 评论