随笔分类 - Interview
delete p和delete[] p的区别(转)
摘要:今天在爱立信南京研发中心笔试碰到一个简答题为:delete p和delete[] p的区别,答的不好,下面从网上拷贝一篇文章,来具体说明。operator new和 operator delete函数有两个重载版本,每个版本支持相关的new表达式和delete表达式:void* operator new (size_t); // allocate an objectvoid* operator new [] (size_t); // allocate an array void operator delete (void*); // free an ojec...
阅读全文
多重继承中二义性的消除
摘要:出现频率:★★★★类A派生B和C, 类D从B,C派生,如何将一个类A的指针指向一个类D的实例?解析:这道题实际上考查的是如何消除多重继承引起的向上继承二义性问题。程序代码如下所示: class A {}; class B : public A {}; class C : public A {}; class D : public B, public C {}; int main() { D d; A *pd = &d; //编译错误 ...
阅读全文
(转)虚函数和纯虚函数区别
摘要:在面向对象的C++语言中,虚函数(virtualfunction)是一个非常重要的概念。因为它充分体现 了面向对象思想中的继承和多态性这两大特性,在C++语言里应用极广。比如在微软的MFC类库中,你会发现很多函数都有virtual关键字,也就是说, 它们都是虚函数。难怪有人甚至称虚函数是C++语言的精髓。那么,什么是虚函数呢,我们先来看看微软的解释:虚函数是指一个类中你希望重载的成员函数,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的版本。 ...
阅读全文
C++中指针和引用的区别
摘要:此文转自:http://www.cnblogs.com/kingln/articles/1129114.html 从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址...
阅读全文
不用判断语句,求两个数中大的那个
摘要:有个讨论帖比较精彩:http://www.chinaunix.net/jh/23/422544.html实现代码:#include <stdio.h>int max(int x,int y){ int buf[2]={x,y}; unsigned int z; z=x-y; printf("z=x-y=%u\n",z); z>>=31; printf("z>>=31=%u\n",z); //int z1; //z1 = x - y; //printf("z1=x-y=%u\n",z); //z1&g
阅读全文
不借助第三个变量交换两个整数的值
摘要:假设两个数x和y,则有:方法1,算术运算(加减):x=x+y; //x暂存两数之和y=x-y; //y为两数之和减去y,即原来的xx=x-y; //x为两数之和减去现在的y(原来的x),变成原来的y方法2,逻辑运算(异或):x^=y; //x先存x和y两者的信息y^=x; //保持x不变,利用x异或反转y的原始值使其等于x的原始值x^=y; //保持y不变,利用x异或反转y的原始值使其等于y的原始值关于异或运算要牢记两个原则:任何一位二进制数同 1 异或都会变成另外一个(0 同 1 异或的结果是 1,1 同 1 异或的结果是 0)任何一位二进制数同 0 异或都保持不变(0 同 0 异或的...
阅读全文
用位运算反转一个字节
摘要:还是不喜欢位运算啊。。。啊啊。。。刚在网上看到一个网友的位运算反转一个字节的帖子,贴过来学习积累啊...上代码:unsigned char reverse8( unsigned char c ){ c = ( c & 0x55 ) << 1 | ( c & 0xAA ) >> 1; c = ( c & 0x33 ) << 2 | ( c & 0xCC ) >> 2; c = ( c & 0x0F ) << 4 | ( c & 0xF0 ) >> 4; return c;}上分
阅读全文
判断32位无符号整数二进制中1的个数
摘要:1、比较简单和容易理解的方法就是逐位比较法:#include <iostream> using namespace std; int findone(unsigned int n){ for(int i=0;n>0;n>>=1) i+=(n&1); return i; } int main(){ int n; cin>>n; cout<<findone(n)<<endl; return 0; }这种方法的缺点是比较费时,时间长度取决于n的位数,时间复杂度O(n)。假如上千上万位的话,每一位都要执行一遍,所用时间就很长了。
阅读全文
常见的单链表题目
摘要:1、判断一个单链表中是否有环思路:给定两个指针fast和low都指向头结点,然后low每次前进一步,fast每次前进两步,如果此单链表中有环,那么fast和low一定会相遇,否则fast一定会先遇到null。实现代码如下:bool isCircle(LinkList *head){ LinkList *fast = head;//快指针 LinkList *low = head;//慢指针 while(low->next != NULL && fast->next->next != NULL) { low = low->next; fast ...
阅读全文
二维数组和指向指针的指针
摘要:一道面试题引发的问题,首先要知道[]的优先级高于*,题目:char **p,a[6][8]; 问p=a是否会导致程序在以后出现问题?为什么?直接用程序说明:#include<stdio.h>void main(){ char **p,a[6][8]; p = a; printf("\n");}编译,然后就会发现通不过,报错:错误1error C2440: “=”: 无法从“char [6][8]”转换为“char **”于是乎,我看了下《C专家编程》里10.5节—使用指针向函数传递一个多维数组。方法一,函数是 void fun(int arr[2][3]); 这
阅读全文
指针做形参做局部变量以及内存分配
摘要:一级指针做形参:首先一定要明白形参和你传递参数的那个实参是两个不同的变量,即使同名也还依然不同。指针传递的是一个变量或者一个值的地址,但是它本身还是采用值传递的方式。即你不能使它指向另外一块地址,但是你可以改变它指向的空间里存的值。二级指针做形参:二级指针也是传值,但是他指向的地址是个一维指针,所以可以改变二维指针指向的地址空间里的内容也就是要申请空间的一维指针,不能改变二维指针本身的值,即不能让他指向一个新的一维指针。所以二维指针传递的是一个一维指针。具体看下面这个程序以及输出:#include<stdio.h>#include <malloc.h>#include
阅读全文
程序在的内存中的分配(常量,局部变量,全局变量,程序代码)
摘要:一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放4.另外还有一个专门放常量的地方。- 程序结束释放在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变
阅读全文
static作用(修饰函数、局部变量、全局变量)
摘要:在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。(1)先来介绍它的第一条也是最重要的一条:隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。下面是a.c的内容chara='A';//globalvariablevoidmsg(){printf("Hello\n");}下面是main.c的内容intmain(void){externchara;//externvariablemustbedeclaredb
阅读全文