c/c++
云中孤鹜
这个作者很懒,什么都没留下…
展开
-
#pragma pack 详解
程序编译器对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们可以屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。编译器中提供了#pragma pack(n)来设定变量以n字节对齐方式。原创 2013-07-05 23:10:08 · 927 阅读 · 0 评论 -
c++中多态函数以及函数重载,覆盖,遮蔽(隐藏)的区别
(1)多态函数指的是在运行期绑定的函数,在c++中,仅有虚函数是在运行期进行绑定的,因此只有虚函数才具有真正意义上的多态。 补充一下:c++中的多态有以下三个前提条件: a.必须存在一个继承体系结构。 b.继承体系结构中的一些类必须具有同名的virt转载 2013-06-27 08:54:01 · 976 阅读 · 0 评论 -
不能使用任何库函数,不能定义任何变量实现strlen和strrev
最近听到的两道面试、笔试题,感觉挺有意思的:1。实现库函数strlen,不能使用任何库函数,不能定义任何变量。2。实现函数strrev,该函数有两个参数,将其中一个字符串逆序放到另一个字符串指针中,同样要求不能使用任何库函数,不能定义任何变量。采用递归实现,刚好可以满足这两道题的要求: void strrev(char **dest, const char *src)//c转载 2013-06-27 08:54:10 · 1424 阅读 · 1 评论 -
c++ strstr函数的实现
函数说明:包含文件:string.h函数名: strstr函数原型:extern char *strstr(char *str1, char *str2);功能:从字符串str1中查找是否有字符串str2, 如果有,从str1中的str2位置起,返回str1的指针,如果没有,返回null。返回值:返回该位置的指针,如找不到,返回空指针。 #include原创 2013-06-27 09:07:00 · 21382 阅读 · 0 评论 -
c++ assert() 使用方法
assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include void assert( int expression );assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。请看下面的程序清单badptr.c:#inclu转载 2013-06-27 09:07:42 · 166496 阅读 · 10 评论 -
详解大端模式和小端模式
详解大端模式和小端模式一、大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下转载 2013-06-27 08:53:38 · 766 阅读 · 0 评论 -
C或C++——strcpy函数的实现
题目: 已知strcpy函数的原型是: char * strcpy(char * strDest,const char * strSrc); 1.不调用库函数,实现strcpy函数。 2.解释为什么要返回char *。 解说: 1.strcpy的实现代码 char * strcpy(转载 2013-06-27 08:53:51 · 727 阅读 · 0 评论 -
[C++面试] 常用的16个cc++面试题
1. C中static有什么作用 (1)隐藏。 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,故使用static在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。 (2)static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和stat转载 2013-06-27 09:07:58 · 1985 阅读 · 0 评论 -
函数调用(递归函数调用)底层机制
函数调用的底层实现 通常,当在一个函数的运行期间调用另一个函数时,在运行被调用函数之前,系统需要先完成3件事: (1)将所有的实在参数,返回地址等信息传递给被调用函数保存 (2)为被调用函数的局部变量分配存储区 (3)将控制转移到被调用函数的入口 被调用函数返回调用函数之前,系统也应该完成3件工作 (1)保存被调用函数的计算结果 (2)释放被调函数的数据区原创 2013-07-01 16:32:47 · 2671 阅读 · 0 评论 -
递归和非递归的方法往二叉排序树中插入新的节点
今天在回寝室的路上同学跟我讨论往二叉排序树中插入新的节点,我一想这不很简单吗,回到寝室立马写了个程序让他看,他一看说我要的是递归的方法。我一想递归的话,每次调用函数不都插入了一个新节点,那不建立成一颗二叉排序树了吗,不是插入一个节点。我又看了一下非递归的方法,发现当根为空时直接将新建的节点p赋给根节点t,这主要用到了引用赋值的原理,对,我可以利用引用的原理。(1)当根为空时,直接将根 t 赋值为新原创 2013-08-25 00:02:37 · 11209 阅读 · 3 评论 -
C++中用二维数组传参时形参该怎样写
C++中用二维数组传参时形参该怎样写 [转]二维数组的存储方式是和一维数组没什么区别,但是用二维数组做参数,它的形参该怎样写?要注意的是:函数中的形参其实就相当于一个声明,并不产生内存分配,形参的目的就是要让编译器知道函数参数的数据类型。正确的是:void Func(int array[3][10]); void Func(int array[][10]); 可以省略转载 2013-08-29 16:48:25 · 990 阅读 · 0 评论 -
顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。直接贴代码:// 面试题20.cpp : 定义控制台应用程序的入口点。#include "stdafx.h"#include using namespace std;//a为要打印的二维数组//start一圈的起始坐标//width为一圈的宽度//要注意防止重读打印void printOneCircle(原创 2013-08-29 19:56:09 · 743 阅读 · 0 评论 -
指针和引用区别
1 引用必须在声明时初始化,而指针不用; 2 对于NULL不能引用,而指针可以指向NULL; 3 引用一旦声明,对象不能改变;而指针可以随时改变指向的对象。 4引用能做到的,指针也可以,但指针更危险; 5 引用主要功能是传递函数的参数和返回值;原创 2013-06-27 08:52:28 · 626 阅读 · 0 评论 -
全局变量,静态全局变量,静态局部变量,类静态成员内存分配与初始化问题
全局变量,静态全局变量,静态局部变量,类静态成员内存分配与初始化问题全局变量,静态全局变量,静态局部变量,类静态成员内存分配都为全局数据区(静态区)(data区) 他们都在程序执行之前就进行了内存分配初始化问题:全局变量,静态全局变量,类静态成员在main函数开始执行之前就进行了初始化,类静态成员必须显示进行初始化.(不晓得对不对)(在vs2008下测试 必须初始化 不过要是永原创 2013-06-26 14:18:18 · 4229 阅读 · 0 评论 -
关于c++类成员方法覆盖或屏蔽
这个是我在调试模版方法模式时得到的结论,与我开始预想的不一样(基本功不扎实)#include "stdafx.h"#include #include using namespace std;class Base{public: virtual void SeeBook();protected: Base(const string _bookname);原创 2013-06-26 14:00:28 · 2109 阅读 · 0 评论 -
关于c++访问权限的一点困惑
今天同学问我一个类似如余下的问题:templateclass Queue{ public: Queue(int _age,string _name);//构造函数 Queue(const Queue & q); //copy构造函数 void print(); private: int age; string name;};temp原创 2013-07-10 12:59:21 · 672 阅读 · 0 评论 -
c++友元
上一篇博文提到了访问权限,想到友元可以改变访问权限,在这里记录一下。 友元用friend申请,其他类不可以访问本类型的私有成员,但是申请友元后侧可以访问。 一般友元有3种形式: 1)友元类 2)友元函数 3)友元成员函数 1友元类class A;//第一步申明友元类class B//第二步定义要申请友元的类(在类中申明友元原创 2013-07-10 14:57:57 · 840 阅读 · 0 评论 -
c++继承详解
公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。1. 公有继承(public)公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。2. 私有继承(private)私有继承的特点是基类的公有成员和保护成员都作为派生类的私有转载 2013-07-10 15:26:43 · 623 阅读 · 0 评论 -
C++ 对象的内存布局(下)
重复继承 下面我们再来看看,发生重复继承的情况。所谓重复继承,也就是某个基类被间接地重复继承了多次。 下图是一个继承图,我们重载了父类的f()函数。 其类继承的源代码如下所示。其中,每个类都有两个变量,一个是整形(4字节),一个是字符(1字节),而且还有自己的虚函数,自己overwrite父类的虚函数。如子类D中,f()覆盖了超类的函数, f1() 和f2() 覆转载 2013-06-26 13:13:53 · 471 阅读 · 0 评论 -
c++自增自减运算汇总(经典)
c++自增自減問題 在程序设计中,经常遇到“i=i+1”和“i=i-1”这两种极为常用的操作。变量i被称为“计数器”,用来记录完成某一操作的次数。C语言为这种计数器操作提供了两个更为简洁的运算符,即++和--,分别叫做自增运算符和自减运算符。它们是从右向左结合的一元算术运算符,优先级为2。学习和应用这两个运算符时应注意以下几点:1 注意表达式的值和变量值的区别 以自增运算符为例,转载 2013-06-26 13:26:31 · 3697 阅读 · 0 评论 -
C结构体内存分配及sizeof大小总结
1.结构体变量的首地址应该是结构体大小的整数倍(当结构体大小大于处理器位数(现在一般是64位即8字节)时,应该是处理器位数(字节数)的整数倍)2.结构体成员相对于结构体首地址的偏移量应该是该成员大小的整数倍。(当成员大小大于处理器位数时,偏移量应该为处理器位数的整数倍)(如有需要编译器会在成员之间加上填充字节 )3.结构体总大小为结构体最大成员长度的整数倍(如果结构体最大成员的大小大于处理原创 2013-06-26 13:52:14 · 1473 阅读 · 2 评论 -
C++堆,栈,自由存储区,全局静态存储区和常量存储区
一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变量和静态变量转载 2013-06-26 14:10:17 · 687 阅读 · 0 评论 -
(必看)C结构体与C结构体之位域(位段)的sizeof问题.
C结构体总结(自己总结)1.结构体变量的首地址应该是结构体大小的整数倍(当结构体大小大于处理器位数(现在一般是64位即8字节)时,应该是处理器位数(字节数)的整数倍)2.结构体成员相对于结构体首地址的偏移量应该是该成员大小的整数倍。(当成员大小大于处理器位数时,偏移量应该为处理器位数的整数倍)(如有需要编译器会在成员之间加上填充字节 )3.结构体总大小为结构体最大成员长度的整数倍(如果原创 2013-06-26 14:12:35 · 1529 阅读 · 0 评论 -
C++ 对象的内存布局(上)
07年12月,我写了一篇《C++虚函数表解析》的文章,引起了大家的兴趣。有很多朋友对我的文章留了言,有鼓励我的,有批评我的,还有很多问问题的。我在这里一并对大家的留言表示感谢。这也是我为什么再写一篇续言的原因。因为,在上一篇文章中,我用了的示例都是非常简单的,主要是为了说明一些机理上的问题,也是为了图一些表达上方便和简单。不想,这篇文章成为了打开C++对象模型内存布局的一个引子,引发了大家对C++转载 2013-06-26 13:09:36 · 566 阅读 · 0 评论 -
C++ 虚函数表解析
前言C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。 关于虚函数的使用方法转载 2013-06-26 13:17:12 · 498 阅读 · 0 评论 -
C++成员变量初始化
C++类中成员变量包括主要四种:普通成员变量,常量成员变量,静态成员变量,静态常量成员变量上述成员变量该如何初始化,注意不是赋值。由于普通成员变量和常量成员变量,每一个类实例化,都一份内存拷贝。C++规定成员变量在声明(注意声明与定义区别)时,不允许初始化,因此这些变量只能放在构造函数初始化列表中。静态成员变量所有类实例化,只有一份内存拷贝,不能放在构造函数中初始化, 因为共享转载 2013-06-26 13:21:55 · 858 阅读 · 0 评论 -
C,C++经典问题,及面试笔试题
1 编程基础1.1 基本概念1.1.1 指针的理解:const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目。 事实上这个概念谁都有只是三种声明方式非常相似很容易记混。 Bjarne在他的The C++ Programming Language里面给出过一个助记的方法: 把一个声明从右向左读。 char *const cp原创 2013-06-26 13:49:16 · 1617 阅读 · 0 评论 -
从海量数据中找出最小的k个数
从大量(海量)数据中查找最小的k(k一般比较小)个数,这是笔试中常考的题目。 如果是从少量数据中查找最小的k个数据,并且允许修改允许修改原始数据,侧利用Partition()函数,在O(N)的时间复杂度,O(1)的空间复杂度就可以找到最小的k个数据。 从大量数据中查找最小的k个数,我们可以利用一个容器先存储前k个数据,然后从数据中读取下一个数,判断该数是与容器中最大的数的大小,如果该数较原创 2013-08-30 17:52:25 · 4330 阅读 · 0 评论