自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(73)
  • 收藏
  • 关注

原创 static在C/C++中的区别和用法

static主要有三个作用:(1)局部静态变量(2)外部静态变量/函数(3)静态数据成员/成员函数前两种C和C++都有,第三种仅在C++中有,下面分别作以下介绍:一、局部静态变量在C/C++中, 局部变量按照存储形式可分为三种auto, static, register。其中register不常用到,下面主要说说auto和static的区别。存储空间分配和生存周期不同auto类型...

2019-04-09 14:12:00 575 2

转载 系统调用和库函数调用的区别

1**、系统调用和库函数的关系**系统调用通过软中断int 0x80从用户态进入内核态。函数库中的某些函数调用了系统调用。函数库中的函数可以没有调用系统调用,也可以调用多个系统调用。编程人员可以通过函数库调用系统调用。高级编程也可以直接采用int 0x80进入系统调用,而不必通过函数库作为中介。如果是在核心编程,也可以通过int 0x80进入系统调用,此时不能使用函数库。因为函数库...

2019-02-16 21:02:54 1887

原创 Linux下C语言实现TCP Socket编程

TCP协议:TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议。TCP服务器端和客户端流程:具体函数:具体实现:服务器端:ser.c#include<stdio.h>#inc...

2019-01-16 18:25:24 6658 1

转载 vim编辑器格式设置

在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号、语法高亮度显示、智能缩进等功能的。为了更好的在vim下进行工作,需要手动设置一个配置文件:.vimrc。在启动vim时,当前用户根目录下的.vimrc文件会被自动读取,该文件可以包含一些设置甚至脚本,所以,一般情况下把.vimrc文件创建在当前用户的根目录下比较方便,即创建的命令为:$vi ~/.vimrc设置完后$:x...

2018-12-17 09:12:21 1293

原创 面试题30——谈谈对面向对象的认识

面向对象可以理解成对待每一个问题,都是首先要确定这个问题由几个部分组成,而每一个部分其实就是一个对象。然后再分别设计这些对象,最后得到整个程序。传统的程序设计多是基于功能的思想来进行考虑和设计的,而面向对象的程序设计则是基于对象的角度来考虑问题。这样做能够使得程序更加的简洁清晰。说明:编程中接触最多的“面向对象编程技术”仅仅是面向对象技术中的一个组成部分。发挥面向对象技术的优势是一个综合的技术问...

2018-12-09 23:55:29 1933

原创 面试题29——构造函数能否成为虚函数

构造函数不能是虚函数。而且不能在构造函数中调用虚函数,因为那样实际执行的是父类的对应函数,因为自己还没有构造好。析构函数可以是虚函数,而且,在一个复杂类结构中,这往往是必须的。析构函数也可以是纯虚函数,但纯虚析构函数必须有定义体,因为析构函数的调用是在子类中隐含的。说明:虚函数的动态绑定特性是实现重载的关键技术,动态绑定根据实际的调用情况查询相应类的虚函数表,调用相应的虚函数。...

2018-12-09 23:53:35 497

原创 面试题28——编码实现字符串转化为数字,数字转化为字符串

字符串转化为数字:int my_Atoi(const char*str){ assert(str!=NULL) if(str==NULL) { return NULL; } while(*str==' ') { str++; } if(*str=='+') { str++; } if(*str=='-') { printf("-"); str++;...

2018-12-09 23:46:56 1301

原创 面试题27——野指针产生的原因和避免方法

情况一原因 指针变量声明时没有被初始化。解决办法 指针声明时初始化,可以是具体的地址值,也可让它指向NULL。情况二原因 指针 p 被 free 或者 delete 之后,没有置为 NULL。解决办法 指针指向的内存空间被释放后指针应该指向NULL。情况三原因 指针操作超越了变量的作用范围。解决办法 在变量的作用域结束前释放掉变量的地址空间并且让指针指向NULL。注意“野指针”...

2018-12-09 10:44:24 445 1

原创 面试题26——简述指针常量和常量指针的区别?关键字const是什么?static有什么作用?extern有什么作用?

指针常量是指定义了一个指针,这个指针的值只能在定义时初始化,其他地方不能改变。常量指针是指定义了一个指针,这个指针指向一个只读的对象,不能通过常量指针来改变这个对象的值。指针常量强调的是指针的不可改变性,而常量指针强调的是指针对其所指对象的不可改变性。const 用来定义一个只读的变量或对象。主要优点:便于类型检查、同宏定义一样可以方便地进行参数的修改和调整、节省空间,避免不必要的内存分配...

2018-12-09 10:40:17 522

原创 面试题25——typedef和define有什么区别

(1)用法不同:typedef 用来定义一种数据类型的别名,增强程序的可读性。define 主要用来定义常量,以及书写复杂使用频繁的宏。(2)执行时间不同:typedef 是编译过程的一部分,有类型检查的功能。define 是宏定义,是预编译的部分,其发生在编译之前,只是简单的进行字符串的替换,不进行类型的检查。(3)作用域不同:typedef 有作用域限定。define 不受作用域约束,...

2018-12-09 10:23:06 737

原创 面试题24——C++的引用和C语言的指针有什么区别

C++的引用和C语言的指针有以下区别:(1)引用必须初始化,但是不分配存储空间。指针不声明时初始化,在初始化的时候需要分配存储空间。引用较比指针更加安全;(2)引用指向一块特定的内存,不能被更改。不存在指向空值的引用,但是存在指向空值的指针。指针可指向任意一块内存,可以改变所指的对象;(3)指针的大小确定,引用的大小根据所引用的类型确定;(4)指针使用时必须解引用;(5)定义一个指针和引...

2018-12-08 22:10:19 2007 1

原创 面试题23——编码实现快速排序及其三种优化

快速排序:int Partation(int *arr,int low,int hign){ int tmp; tmp=arr[low]; while(low<hign) { while((low<hign)&&arr[hign]>=tmp) { hign--; } if(low>=hign) { break; ...

2018-12-08 21:54:11 286

原创 面试题22——编码实现堆排,归并排序,基数排序

堆排(大根堆):void adjust(int*arr,int start,int end){ int tmp=arr[start]; for(int i=2*start+1;i<=end;i=2*i+1) { if(i<end&&arr[i]<arr[i+1]) { i++; } if(arr[i]>tmp) { ...

2018-12-08 20:30:23 249

原创 面试题21——编码实现直接插入排序,shell排序,冒泡排序,直接选择排序

#include<iostream>void insertsort(int *arr,int len){ int i,j,tmp; for(i=1;i<len;++i) { tmp=arr[i]; for(j=i-1;i>=0;--j) { if(tmp>arr[j]) { arr[j+1]=

2018-12-08 14:00:24 326

原创 面试题20——计算一颗二叉树的深度

深度计算函数:int depth(BSTree T){ if(!T) { return 0; } int d1=depth(T->lchild); int d2=depth(T->rchild); return (d1>d2?d1:d2)+1;}

2018-12-08 13:51:52 1147

原创 面试题19——怎样把一个单链表反序

(1)反转一个链表。循环算法:List reverse(List n){ if(!n) //判断链表是否为空,为空退出 { return n; } list cur=n.next; //保存头结点的下个节点 list pre=n; //保存头结点 list tmp; pre.next=NULL; //头结点的指针指空,转换后变尾结点;...

2018-12-08 13:46:29 963

原创 面试题18——链表和数组有什么区别

数组和链表有以下不同:(1)存储形式:数组是一块连续的空间,声明时就要确定长度。链表是一块可不连续的动态空间,长度可变,每个节点要保存相邻结点指针;(2)数据查找:数组的线性查找速度快,查找操作直接使用偏移地址。链表需要按顺序检索结点,效率低;(3)数据插入或删除:链表可以快速插入和删除结点,而数组则可能需要大量数据移动;(4)越界问题:链表不存在越界问题,数组有越界问题。数组便于查询,...

2018-12-08 13:32:38 3284

原创 面试题17——简述多态实现的原理

编译器发现一个类中有虚函数,便会立即为此类生成虚函数表vtable。虚函数表的各表项为指向对应虚函数的指针。编译器还会为此类中隐含插入一个指针vptr(对vc编译器说,它插在类的第一位置上)指向虚函数表。调用此类的构造函数时,在类的构造函数中,编译器会隐含执行vptr与vtable的关联代码,将vptr指向相应的vtable,将类与此类的vtable联系起来。另外在调用类的构造函数时,指向基础类的...

2018-12-08 13:24:33 1218

原创 面试题16——简述类成员函数的重写,重载和隐藏的区别

重写与重载主要有以下不同:(1)范围的区别:被重写的和重写的函数在两个类中,而重载和被重载的函数在同一个类中;(2)参数的区别:被重写函数和重写函数的参数列表一定相同,而被重载函数和重载函数的参数列表一定不同;(3)virtual的区别:重写的基类中被重写的函数必须要有virtual修饰,而重载函数和被重载函数可以被virtual修饰,也可以没有隐藏和重写,重载有以下不同:(1)与重载的...

2018-12-08 12:45:03 762

原创 面试题15——用C++设计一个不能被继承的类

template <typename T>class A{ friend T;private: A(){} ~A(){}};class B:virtual public A<B>{public: B(){} ~B(){}};class C:virtual public B{public: C(){} ~C(){}};void ma..

2018-12-08 09:34:44 230

原创 面试题14——谈谈对拷贝构造函数和赋值运算符的认识

拷贝构造函数和赋值运算符重载有以下两个不同之处:(1)拷贝构造函数生成新的类对象,赋值运算符不能;(2)由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不需要检测原对象是否和新建对象相同,而赋值运算符则需要这个操作,另外赋值运算中如果原来的对象中有内存分配要先把内存释放掉当类中有指针类型的成员变量时,一定要重写拷贝构造函数和赋值运算符,不能使用默认的。...

2018-12-07 21:02:23 534

原创 面试题13——C++空类有哪些成员函数

缺省构造函数缺省拷贝构造函数缺省析构函数缺省赋值运算符缺省取址运算符缺省取址运算符 const

2018-12-07 20:56:22 947

原创 面试题12——面向对象的三大特性

面向对象的三大特征:封装性,继承性,多态性(1)封装性:将客观事物抽象成类,每个类对自身的数据和方法实行保护(protected,private,public)(2)继承性:广义的继承有三种实现形式:a,实现继承(使用基类的属性和方法而无需额外编码的能力)b,可视继承(子窗体使用父窗体的外观和实现代码)c,接口继承(仅使用属性和方法,实现滞后到子类实现)(3)多态性:是将父类对象设...

2018-12-07 20:53:26 1053

原创 面试题 11——设置地址为 0x67a9 的整型变量的值为 0xaa66

强制类型转换的典型例子,无论在什么平台地址长度和整形数据的长度是一样的。即一个整型数据可以转换成地址指针类型,只需确保有意义即可。int *ptr=(int*)0x67a9;*ptr=0xaa66;...

2018-12-07 20:30:56 2935

原创 面试题10——简述strcpy,sprintf,memcpy的区别

三者主要有一下不同之处:(1)操作对象不同:strcpy的两个操作对象均是字符串sprintf的操作源对象可以是多种数据类型,目的操作对象是字符串memcpy的两个对象就是两个人一可操作的内存地址,不限于何种数据类型。(2)执行效率不同:memcpy最高,strcpy次之,sprintf效率最低。(3)实现功能不同:strcpy主要实现字符串变量间的拷贝sprintf主要实现其他...

2018-12-07 20:25:09 676

原创 面试题9——简述C,C++程序编译的内存分配情况

一个C,C++程序编译时内存分为5大存储区:堆区,栈区,全局区,文字常量区,程序代码区。C,C++中内存分配方式可以分为三种:(1)从静态存储区域分配:内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量等。(2)在栈上分配:在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指...

2018-12-07 20:15:19 1814 1

原创 面试题8——a和&a有什么区别?

例:void main(){ int a[5]={1,2,3,4,5}; int*ptr=(int*)(&a+1); printf("%d,%d",*(a+1),*(ptr-1));}输出结果为:2,5;数组名a可以作数组的首地址,而&a是数组的指针。当intptr=(int)(&a+1)改为intptr=(int)(a+1)时,输出结果为:1...

2018-12-07 00:39:20 395

原创 面试题7——一个指针可以是volatile吗?

可以。因为指针和普通变量一样,有事也有变化程序的不可控性。常见例:子中断服务子程序修改一个指向一个buffer的指针时,必须用volatile来修饰指针。指针是一种普通的变量,从访问上没有什么不同于其他变量的特性。其保存的数值是个整形数据,和整型变量不同的是,这个整型数据指向的是一段内存地址。...

2018-12-07 00:32:22 5031

原创 面试题6——写一个“标准”宏MIN和MAX

MIN#define min(a,b)((a)<=(b)?(a):(b))在调用时应注意这个宏定义的副作用,如下调用:(++*p)<=(x)?(++*p):(x)p指针自加了两次,违背MIN本意MAX#define max(a,b)((a)>=(b)?(a):(b))...

2018-12-07 00:21:32 3845

原创 面试题5——C中的malloc和C++中的new有什么区别?

malloc和new有以下区别:(1)new,delete是操作符,只能在C++中使用;(2)malloc,free是函数,可以覆盖,C,C++中都可以使用;(3)new可以调用对象的构造函数,对应的delete调用相应的析构函数;(4)malloc仅仅分配内存,free仅仅回收内存,并不执行构造和析构函数;(5) malloc/free需要手动计算类型大小且返回值为void*,new/...

2018-12-07 00:15:31 2559

原创 面试题4——C语言的关键字static和C++的关键字static有什么区别?

在C中static用来修饰局部静态变量和外部静态变量、函数。而C++中除了以上功能之外,还可以用来定义类的成员变量和函数。即静态成员和静态成员函数。编程时static的记忆性和全局性的特点可以让在不同时期调用的函数进行通信,传递信息,而C++的静态成员则可以在多个对象实例间进行通信,传递信息。...

2018-12-06 23:54:26 889

原创 面试题3——sizeof和strlen的区别

sizeof和strlen有如下区别:(1)sizeof是一个操作符,strlen是库函数;(2)sizeof的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为’\0’的字符串做参数;(3)编译器在编译时就计算出了sizeof的结果。而strlen函数必须在运行时才能计算出来。并且sizeof计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度;(4)数组做s...

2018-12-06 23:49:19 1626

原创 面试题2——写出bool,int ,float,指针变量与“零值”比较的if语句

bool型数据if(flag){ A;}else{ B;}int型数据if(0!=flag){ A;}else{ B;}指针型数据if(NULL==flag){ A;}else{ B;}float型数据if((flag>=NORM)&&(FLAG<=NORM))

2018-12-06 23:36:30 1603

原创 面试题1——变量的声明和定义有什么区别?

为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明,但是只能在一个地方定义。加入extern修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间,如外部变量。...

2018-12-06 23:27:32 4500

原创 练习10-----翻转单词顺序 和 左旋转字符串

翻转单词顺序第一步翻转句子中所有的字符。如翻转"I am a student.“中的所有字符得到”.tneduts a ma I",此时不但翻转了句子中单词的顺序,连单词内的字符顺序也被翻转。第二步再翻转每个单词中的字符的顺序,就得到了"student. a am I"。关键在于实现一个函数以翻转字符串中的一段。下面Reserve可以完成这一功能:void Reserve(char *pB...

2018-12-06 22:51:48 128

原创 练习9-----牛牛的括号匹配

如果一个括号序列中的每一个左括号都有一个右括号与之完成配对,这个序列就是一个合法的括号匹配序列。例如:“((())),()()()”是合法的括号匹配序列,“(((())()((()”是不合法的括号匹配序列。牛牛得到了一系列的括号序列,牛牛要从这个系列中任意选取两个位置进行一次交换操作,仅且只能进行一次操作。牛牛想知道能否通过这次操作,把这个系列变成合法的括号匹配序列。输入描述:输入第一行...

2018-12-06 18:47:34 291

原创 练习8-----两个队列实现一个栈

操作两个先进先出的队列实现一个先进后出的栈,完成栈的Push和Pop操作。分析:如图(1)所示,先向栈内压入一个元素a,由于两个队列现在都为空,可以选择把a插入到两个队列的任意一个,选择queue1插入a,继续往栈内压入元素b,c,都把它们插入queue1.此时queue1包含三个元素a,b,c,其中a位于队列的头部,c位于队列的尾部。从栈内弹出一个元素。由于栈的先进后出原则,最后被压栈的c最...

2018-12-06 17:56:14 287

原创 练习7-----两个栈实现一个队列

操作两个先进后出的栈实现一个先进先出的队列,完成队列的Push和Pop操作。分析:首先插入一个元素a,将它插入到Stack1,此时stack1中的元素有{a},stack2为空。再向stack1压栈两个元素b和c,,此时stack1中的元素有{a,b,c},其中c位于栈顶。而stack2仍为空。如图(1)所示。当从队列删除一个元素时,按照先进先出规则,此时应该删除的元素为a,元素a存储在sta...

2018-12-06 16:48:49 123

转载 c++详解【new和delete】

说起new和delete,了解过c++的人应该都知道吧,它是用来分配内存和释放内存的两个操作符。与c语言中的malloc和free类似。c语言中使用malloc/calloc/realloc/free进行动态内存分配,malloc/calloc/realloc用来在堆上分配空间,free将申请的空间释放掉。malloc:void FunTest(){ int *pTest = (int*...

2018-11-29 19:29:59 358

原创 练习6-----在一个整数的数组中删除另外一个整数数组中的元素,并保留原数组的次序

编程:在一个整数的数组中删除另外一个整数数组中的元素,并保留原数组的次序输入包括两行:第一行是被删除的整数列表(记为列表A),每个整数之间使用空格分隔第二行是需要删除的整数列表(记为列表B),每个整数之间使用空格分隔输出只有一行,即列表A中删除列表B元素后的整数列表,输出元素按照在列表A中的次序排列,每个整数之间使用空格分隔样例输入:1 2 3 4 52 4样例输出:1 3 5...

2018-11-29 13:16:06 801

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除