一次电话面试题

C++中引用与指针的区别?

https://blog.csdn.net/zhengqijun_/article/details/54980769

大小端这个问题在面试过程中偶尔会被问到

 

第一种:联合(union)方式判断法

在union中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同

的起始地址。即上述的union虽然定义了两个成员,但其实这个union只占用了4个字节(32位机器中),往a成员

赋值,然后读取b就相读取a成员的低位第一个字节的值。如果机器使用大端模式,则u.a=1那a的最高字节值为1;

如果机器使用小段模式,则u.a=1则a的最低位字节为1。上述可知b和a有相同的起始位,所以读取b如果等于1,

则为小端模式,b为0则为大端模式

typedef union {

    int i;

    char c;

}my_union;


int checkSystem1(void)

{

    my_union u;

    u.i = 1;

    return (u.i == u.c);

}



第二种称之为直接判断法,怎么直接判断呢,其实就是根据大小端各自的存储方式编写程序进行判断,这个方法更直接。

首先我们来看下大小端的存储方式:

大端模式(Big_endian)   -- 字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。

小端模式(Little_endian)-- 字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。

根据这个特性,假设我们初始化了一个int变量i为0x12345678,其地址为0x100,根据定义在小端模式下

0x100一个字节内的值为0x78,类推0x101=>0x56,0x102=>0x34,0x103=0x12,根据这个编程如下

int checkSystem2(void)

{

    int i = 0x12345678;

    char *c = &i;

    return ((c[0] == 0x78) && (c[1] == 0x56) && (c[2] == 0x34) && (c[3] == 0x12));

}




int main(void)

{

    if(checkSystem1())

    printf("little endian\n");

    else

    printf("big endian\n");


    if(checkSystem2())

    printf("little endian\n");

    else

    printf("big endian\n");


    return 0;

}

如果返回1表示小端,反则表示大端;


我曾经在面试中被问及该问题,当时我用的是第一种方法,用口述方式进行的,我还没陈述完,面试官

就笑着说看来你是在网上看到了这样的方法,自己的理解不够深入! 他的话其实有点武断,用第一种

方法并不表明我就没有深入理解大小端。但是人都有主观判断性,面试官对我主观的印象就这样了!

所以以后面试还被问到就用第二种方法吧,这个描述起来,对方替听起来你总算是理解了大小端的本质

就是存储方式

虚函数纯虚函数的区别
虚函数底层是如何实现的?

https://blog.csdn.net/lihao21/article/details/50688337


free和malloc的区别?

(1)new、delete 是操作符,可以重载,只能在C++中使用。
(2)malloc、free是函数,可以覆盖,C、C++中都可以使用。
(3)new 可以调用对象的构造函数,对应的delete调用相应的析构函数。
(4)malloc仅仅分配内存,free仅仅回收内存,并不执行构造和析构函数
(5)new、delete返回的是某种数据类型指针,malloc、free返回的是void指针。

注意:malloc申请的内存空间要用free释放,而new申请的内存空间要用delete释放,不要混用。因为两者实现的机理不同。

1 我认为new\delete和malloc\free最大区别是对对象的理解。
如果你使用
Foo* foo = malloc(sizeof(Foo));//Foo是一个类
初始化,那么你将不会调用Foo的构造方法,而只是单纯的分配空间。而且我们只认为你是分配一个空间,而不是想创建一个对象。
Foo* foo = new Foo();则会调用Foo的构造方法来初始化对象,也就是说你既要分配空间又要初始化这段空间,让它变成一个对象。
对于delete和free也有同样的问题,就是delete会调用析构函数,free则不会。
说白了,new\delete玩的是对象,而malloc\free仅仅是内存空间而已
2 对于除去对象意外的其他情况,比如int和float等
int* Array=new int[10];和int* Array=malloc(sizeof(int)*10);只存在使用技巧的差别,没有本质的差别。
3 最后也提醒你new\delete和malloc\free只能成对使用,不能混了。

https://blog.csdn.net/chy19911123/article/details/48135239
代码有哪些分区:https://blog.csdn.net/u014470361/article/details/79297601

代码区:存放程序的代码,即CPU执行的机器指令,并且是只读的。 
常量区:存放常量(程序在运行的期间不能够被改变的量,例如: 10,字符串常量”abcde”, 数组的名字等) 
静态区(全局区):静态变量和全局变量的存储区域是一起的,一旦静态区的内存被分配, 静态区的内存直到程序全部结束之后才会被释放 
堆区:由程序员调用malloc()函数来主动申请的,需使用free()函数来释放内存,若申请了堆区内存,之后忘记释放内存,很容易造成内存泄漏 
栈区:存放函数内的局部变量,形参和函数返回值。栈区之中的数据的作用范围过了之后,系统就会回收自动管理栈区的内存(分配内存 , 回收内存),不需要开发人员来手动管理。栈区就像是一家客栈,里面有很多房间,客人来了之后自动分配房间,房间里的客人可以变动,是一种动态的数据变动。 

 


int a=1;
int b=a;全局变量会出现问题吗?
全局变量的初始化顺序是什么?

https://blog.csdn.net/macrohasdefined/article/details/8814458

 对于不同编译单位的全局变量,其初始化的顺序没有任何的保证,因此对不同编译单位里的全局变量,在它们的初始化顺序之间建立依赖性都是不明智的。
       此外也没办法捕捉到全局变量初始化抛出的异常,一般来说要减少全局变量的使用,特别是限制那些要求复杂初始化的全局变量。所以,尽量不用全局变量;用静态变量,通过访问器进行访问。

例如:全局变量   
        int   a   =   5;   
        int   b   =   a;   
       如果a和b定义在同一个文件里,那没什么问题,结果b等于5;如果a和b定义在不同文件里,就不能保证b也等于5,也就是说不能保证a先初始化。

       事实上,除了在同一个文件定义的全局对象的初始化是按照定义次序来进行的之外,其他全局或静态变量之间的初始化次序没有任何保障。解决这种问题的方法是不直接使用全局变量,而改用一个包装函数来访问,例如   
  int   get_a()   
  {   
          static   int   a   =   5;   
          return   a;   
  }   
  int   get_b()   
  {   
          static   int   b   =   get_a();   
          return   b;   
  }   
    
       这样的话,无论get_a和get_b是否定义在同一个文件中,get_b总是能够返回正确的结果,原因在于,函数内部的静态变量是在第一次访问的时候来初始化。 

       任何时候,如果在不同的被编译单元中定义了"非局部静态对象",并且这些对象的正确行为依赖于它们被初始化的某一特定顺序,就会产生问题.你绝对无法控制不同被编译单元中非局部静态对象的初始化顺序。对于函数中的静态对象(即"局部"静态对象)它们在函数调用过程中初次碰到对象的定义时被初始化..  

       PS:千万不要写出和编译顺序相关的程序来。 

 

       关于全局变量的初始化,C语言和C++是有区别的。      
       在C语言中,只能用常数对全局变量进行初始化,否则编译器会报错。       
       在C++中,如果在一个文件中定义了int a = 5;要在另一个文件中定义int b = a;的话,前面必须对a进行声明:extern   int   a;否则编译不通过。即使是这样,int b = a;这句话也是分两步进行的:在编译阶段,编译器把b当作是未初始化数据而将它初始化为0;在执行阶段,在main被执行前有一个全局对象的构造过程,int b = a;被当作是int型对象b的拷贝初始化构造来执行。    
      其实,准确地说,在C++中全局对象、变量的初始化是独立的,如果不是象int a   =   5;这样的已初始化数据,那么就是象b这样的未初始化数据。    
      而C++中全局对象、变量的构造函数调用顺序是跟声明有一定关系的,即在同一个文件中先声明的先调用。对于不同文件中的全局对象、变量,它们的构造函数调用顺序是未定义的,取决于具体的编译器。


堆栈代码区,全局数据区
虚函数是怎么实现的
多线程编程

线程之间是如何通信的?

多个线程共享进程的资源,都有哪些资源?

进程之间如何通信
linux script
per script

const char *p 与 char *p const的区别?

https://blog.csdn.net/m0_37806112/article/details/81252151

    const char *p; // 声明一个指向字符或字符串常量的指针(p所指向的内容不可修改)

    char const *p;// 同上(我在这栽了,期望读者能避免同样的错误)

    char * const p;//声明一个指向字符或字符串的指针常量,即不可以修改p的值,也就是地址无法修改。

在一段磁盘存了很多cake,现在需要抓一个cake,每个cake有一个key,如何在用到的时候快速找到这个cake 
请说出你的解决方案 

使用map来保存???

 

extern 和static 的用法

extern 是建立了一个其他文件的变量的引用

static 

析构函数为什么写成虚函数

如将基类的析构函数定义为虚函数,当删除一个指向派生类的基类指针的时候,首先会调用派生类的析构函数,然后再调用基类的析构函数。否则只会调用基类的析构函数。

这次面试发现自己的基础很弱,很多不常用的概念都会涉及到,所以要打好基础。才能有所发挥

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aFakeProgramer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值