![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c/c++
文章平均质量分 77
iris_gril
这个作者很懒,什么都没留下…
展开
-
c++直接插入排序
/*直接插入排序: 从第二个数开始,把每个数插入到前面合适的位置,知道所有的数据插入完成为止*/#include #include using namespace std;#define N 10void PrintArr(int *pnArr, int nLen){ int i; for (i = 0; i < nLen; i++) { cout<<pnArr[原创 2013-12-31 01:48:35 · 468 阅读 · 0 评论 -
C/C++语言函数参数传递:传值,传指针,传引用
前面我们介绍了函数的调用约定,明白了函数调用者与被调用者之间传递参数的顺序与如何进行栈恢复的。 实际上,函数调用者如何将参数传递给被调用者也是有讲究的。 总的来说,函数参数传递分为3种情况:传值,传指针和传引用。首先,理解一下实参与形参的概念。int func(int x)//x是形参{ return x*x;}int main(void){ int转载 2016-01-08 14:50:51 · 1472 阅读 · 0 评论 -
自然对齐
在每年各个公司的笔试题中,有一种典型的问题就是计算sizeof()结构体大小的问题。要掌握好这类问题,需要了解结构体的自然对齐规则。一,基本类型的长度计算要做好sizeof相关的计算,首先得掌握C和C++里的一些基本类型的长度(注意,sizeof计算的值都是以字节(Byte)为单位):sizeof(char)的长度为:1sizeof(short)的长度为:2sizeof转载 2016-01-08 14:51:42 · 2582 阅读 · 0 评论 -
static关键字
关键字static的作用经常被作为面试题考查。本人在面试微软工程院的时候就曾经遇到过这个问题的考查。 那么,static关键字的含义有哪些呢?现在总结如下:1.static修饰变量static可以修饰变量。当static修饰全局变量时,表示该变量的作用域只存在于本文件。其他文件就不能引用。比如:在a.c文件里定义了2个全局变量:static int x = 10;int y转载 2016-01-08 14:52:18 · 277 阅读 · 0 评论 -
内存泄漏与检测
动态分配的内存在程序结束后而一直未释放,就出现了内存泄漏。一般常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。应用程序一般使用malloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,就说这块内存泄漏了。 接着来分析下转载 2016-01-08 14:52:57 · 377 阅读 · 0 评论 -
溢出问题
在C/C++程序里有一类非常典型的问题,那就是:溢出问题。一般在笔试题里,这类问题会以程序改错或者安全问题出现。现在分别来分析一下常见的数组溢出,整数溢出,缓冲区溢出,栈溢出和指针溢出等。(1)数组溢出在C语言中,数组的元素下标是从0开始计算的,所以,对于n个元素的数组a[n], 遍历它的时候是a[0],a[1],...,a[n-1],如果遍历到a[n],数组就溢出了。 void转载 2016-01-08 14:53:37 · 1926 阅读 · 0 评论 -
extern关键字
对于关键字extern的用法,有如下几种情况:第一,引入其它文件中定义的全局变量或者函数。比如在a.c文件里定义了一个全局变量和函数:/*file:a.c*/int g_total_number=100;int func(void){ ....}如果想在b.c文件里引用a.c文件里的全局变量与函数(不能有static修饰),那么就可以在b.c里使用exte转载 2016-01-08 14:54:14 · 301 阅读 · 0 评论 -
volatile关键字
volatile是C语言中的一个修饰符关键字。一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样, 编译器就不会去假设这个变量的值了。当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中; 以后,再取变量值时,就直接从寄存器中取值。 精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值, 而不是使用保存在寄存器里的备份或者被优化。转载 2016-01-08 14:54:53 · 319 阅读 · 0 评论 -
宏定义
1,定义一个宏,计算数组的长度#define ARRAYSIZE(a) sizeof(a)/sizeof(a[0])2,定义一个宏,计算结构体中成员的偏移#define offsetof(s,m) (size_t)&(((s *)0)->m) 3,多语句宏:在程序设计中,另外一个很经典的算法就是将两个数进行交换。比如有2个整数:int a = 10;int b转载 2016-01-08 14:55:30 · 487 阅读 · 0 评论 -
字符串初始化
在代码里,经常会用字符串进行初始化操作。比如:void func(void){ char str1[] = "hello world"; char *str2="hello world"; ...}对于上面2条初始化语句,它们的区别是什么呢?1,首先,"hello world"是一个字符串常量,存放在静态常量区。2,str1是一个字符数转载 2016-01-08 14:56:39 · 595 阅读 · 0 评论 -
指针
指针是C语言中的精华。指针其实就是一个变量,和其他类型的变量一样。在32位机器上,它是一个占用四字节的变量(64位上占八个字节),它与其他变量的不同就在于它的值是一个内存地址,指向内存的另外一个地方。 指针根据其所指向的数据的类型可以分为:1)内建型别的指针,指向的是C语言中的一些内建型别char *pch;int *pi;float *pf;double *pd;转载 2016-01-11 10:10:00 · 592 阅读 · 0 评论 -
strlen与sizeof区别
strlen与sizeof都可以用来计算相关字符指针和字符数组的长度,容易混淆。这里用实际例子对它们加以区分。总的来说:strlen是用来计算字符串的字符个数(不含'\0')的函数;而sizeof是用来计算类型或者变量的存储大小的操作符(而不是函数),因此sizeof的结果是在编译阶段就能确定的。题目:char *p1 = "12345678"; char p2[] = "转载 2016-01-11 10:15:11 · 446 阅读 · 0 评论 -
调用约定:cdecl,stdcall,fastcall
函数调用约定(Calling Convention),是一个重要的基础概念,它规定了程序执行过程中函数的调用者(caller)和被调用这(callee)之间如何传递参数以及如何恢复栈平衡之间的约定。在笔者面试微软ATC的过程中即被面官考查。当然笔者当时也很顺利的举出了这些调用规约,只是对C++中的一个调用规约记得不大清楚了。下面就来研究这些函数调用约定。在参数传递中,有两个很重要的问题必须得到转载 2016-01-08 14:50:08 · 396 阅读 · 0 评论 -
内存逻辑地址到物理地址转化
我们知道,在计算机里,内存分为虚拟内存和物理内存。 数据是存放在物理内存中的,而程序中使用的是虚拟内存并通过虚拟内存地址来访问数据和代码的,那么操作系统是如何 将虚拟内存地址映射成为实际的物理内存的呢?这是我们这篇文章要详细介绍的问题。以X86的32位系统为例。如下图所示,在目前的32位的系统中,系统的内存虚拟地址范围为4GB。 其中低2GB主要为应用程序使用(Ring3级别),而高2GB转载 2016-01-08 11:42:50 · 6242 阅读 · 0 评论 -
数据结构线性表1
# include # include # include struct Arr//定义了一个数据类型,该数据类型的名字是struct Arr{ int * pBase;//存储的是数组第一个元素的地址 int len;//数组所能容纳的最大元素的个数 int cnt;//当前数组有效元素的个数 //int increment;//自动增长因原创 2013-12-28 01:00:23 · 497 阅读 · 0 评论 -
冒泡排序
/*冒泡排序: (最大n-1轮排序) 每次循环从第1个元素开始,不停地比较相邻的元素,如果不满足排序要求,就交换相邻元素,直到所有的元素都已经排好序为止。*/#include #include using namespace std;#define N 16void PrintArr(int *pnArr, int nLen){ int i; for (i = 0; i原创 2013-12-31 01:59:17 · 373 阅读 · 0 评论 -
教你认识指针(一)
#include using namespace std;#include #include //间接赋值//通过形参改变实参int demo02(int *p/*out*/){ int rv=0; *p=1000; return rv;}int demo01(){ int rv=0; int iNum=0; int *p=NULL; iNum=1; p=&原创 2014-01-11 00:30:52 · 454 阅读 · 0 评论 -
sizeof()计算
在每年各个公司的笔试题中,有一种典型的问题就是计算sizeof()的大小问题。在这里,我们对这类问题做一个全面的归纳总结,包含如何 计算结构体,位域,数组,字符串,指针,C++中的class等所有内容。 大家在以后遇到这类问题,就应该信心十足了。当然,掌握这些计算,也不全是为了应付面试,更多的能加深对C的理解和掌握。能够进一步应用到平时的程序设计与调试中。一,基本类型的长度计算要做转载 2016-01-08 11:33:04 · 2604 阅读 · 0 评论 -
位运算与应用
一,位运算基础位运算(包括与,或,取反,异或,左移,右移等)是程序设计中的一个重要的领域。尤其是安全和底层开发中,除了指针的频繁使用之外,位运算是另一个非常频繁使用的领域。 因此,在求职面试中,位运算也是每年重点考查的知识点。首先,我们有必要复习一下C语言中位运算的一些基础计算方法。 1,与运算:&与运算的操作符为&。2个数进行与运算时,就是将这2个数的二进制进行与操作原创 2016-01-08 11:34:26 · 3199 阅读 · 1 评论 -
运算符
1.C语言的操作符共有15个优先级,下表展示了各个操作符及其优先级和结合律: 2.记忆口诀: 记忆不能死记,即使通过死记记住了,那也是短期记忆,长久之后也记不住,因此需要讲究特别的技巧。下表用三句话记住所有运算符的优先级:3.操作符易错处 如果不熟悉各操作符的优先级,很容易出现计算错误。一个常见的错误就是移位操作符(>) 与算术操作符之间的优先级。例如想把一原创 2016-01-08 11:35:57 · 239 阅读 · 0 评论 -
整数的存储
大家知道,整数包括负数,零,和正数。计算机中的整数分为有符号数和无符号数。有符号数的最高位表示符号:即最高位为0,表示正数,最高位为1,表示负数。无符号数表示非负数,整个位数都用来表示整数的值。 如果用N位来表示整数,那么有符号数的范围为:[-2^(N-1),(2^(N-1))-1];无符号数的表示范围为[0,(2^N)-1]。比如,用8位来表示有符号整数数,由于第8位用于表示了符号,因此,整数的转载 2016-01-08 11:37:03 · 2601 阅读 · 0 评论 -
整数进制转换(十六进制,十进制,二进制)--表格法
在计算机里,最基本的存储单位为字节(Byte,常说的大B),1个字节包含8位(bit,常说的小b)。计算机的数据就是一个字节一个字节的形式存储在内存中。 内存的大小单位有KB,MB,GB,TB等,它们之间的关系是:1KB = 1024B1MB = 1024*1024B1GB = 1024*1024*1024B1TB = 1024*1024*1024*1024B 计算转载 2016-01-08 11:37:53 · 8304 阅读 · 0 评论 -
浮点数的表示与存储方法
计算机中的数分为整数与实数。对于实数,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。 这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa ), 一个基数(Base),一个指数(也叫阶码)(Exponent)以及一个表示正负的符号(Sign)来表达实数。 比如 123.45 用十进制科学计数法可以表达为 1.2345 × 10^2 ,其中 1.2345 为尾数,10 为基数,转载 2016-01-08 11:39:35 · 884 阅读 · 0 评论 -
变量类型,作用域,存储空间,生命周期
一,变量与常量定义在C/C++程序里,参与计算的数据都是通过存放在内存中不同类型的常量或者变量来表示的。常量,就是不同类型中不变的值。比如’A’, 100, 3.1415926,"hello world"等等。可以通过宏来定义一些常量,比如:#define PI 3.1415926上面就用一个常量符号PI来定义了圆周率的值。以后就可以在程序中使用这个PI来计算圆相关的数值。转载 2016-01-08 11:40:27 · 1689 阅读 · 0 评论 -
表达式求值计算
在C语言中,表达式由运算符、常量及变量构成。每一个表达式,都有对应的一个值。 该值与表达式中操作符的优先级和结合律有关。表达式求值,也会经常出现在名企求职的笔试试题里。 1.位运算表达式求值位运算表达式求值,需要掌握位运算的定义和整数十进制到二进制之间的转化方法。 (具体请参考:进制转化) 题目:试着计算如下表达式的值(某安全名企面试笔试题目):1)15&240转载 2016-01-08 11:41:30 · 464 阅读 · 0 评论 -
C中预编译详解
预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。在C 语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。要完成这些工作,就需要使用预处理程序。尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。预处理过程读入源代码,检查包含预处理指令的语句和原创 2016-03-15 10:45:22 · 431 阅读 · 1 评论