小狼,你家BOSS喊你面试啦!!!(三)

1、C语言中struct和union的区别

struct占用的空间大小是每个元素对齐后的所占空间总和;而union是占用字节数最大的那个元素的字节数。

联合体所有成员共享一块内存;结构体成员之间所占字节需要累加的

另一方面就是,成员函数赋值问题,union会用新的值覆盖以前的值

2、C和C++的struct有什么区别

C++中struct可以有自己的成员函数。而C的则没有。

上面一条说对了,就是成员函数之间的区别

还有就是:C++中struct对数据成员的访问有三种状态的,而C中struct则不会有public、private、protected访问权限

C++中struct有继承的关系。C中没有。

3、C++中struct和class的区别

一:默认的访问权限(struct是public;而class默认是private)

其实重点区别就是继承、访问的权限的不同

C++保留struct的原因:主要是因为兼容的问题

4、一些结构中的冒号和数字是什么意思

没懂题目

typedef struct

{

    int a:2;     //冒号,表示位段  不能超过类型占用空间大小

    int b:2;

    int c:1;

}

位段的结构体成员必须是int型的;位段在内存中的存储方式由编译器决定

5、有效的计算2*8的方法是什么

2<<3

求一个整数的7倍

(X<<3)-X

6、如何实现位操作求两个数的平均值

两个数分别右移再相加

一般不是求和之后除以2嘛,所以对每一个右移(除2)再相加,是可以的

当然还可以:(x&y)+((x^y)>>1)     这个也表示求xy的平均值

扩展:求一个数X的绝对值呢?

int abs(int x)

{

    int y=x>>31;

    return (x^y)-y;

}

7、unsigned int i=3;printf("%u\n",i*-1);输出为多少

不知道

8、如何求解整形数中二进制中1个个数

和1按位与吧,然后右移

第一种:写一个函数,x与x-1按位与。

int fun(int x)

{

    int count=0;

    while(x)

    {

        count++;

        x=x&(x-1);

    }

    return count; 

}

9、不能用sizeof关键字,如何判断操作系统是16位函式32位

定义一个char或者int的数组,取相邻元素的地址做减法。

一、是根据数字的最大值来判断。

int a=65536;32位下可以的喂

10、嵌入式编程中什么是大端,什么是小端

低位字节放在高地址位置就叫大端存储,低位字节放在底地址位置就叫小端存储

采用小端模式的CPU对操作数的存放方式是从低字节到高字节;大端模式则是对操作数的存放方式是从高字节到底字节。

如0x1234   12高字节  34低字节   存放从0x4000        (16位宽字节)

小端(低字节放地位)0x4000:34    0x4001:12

大端(高字节放地位)0x4000:12    0x4001:34

如0x12345678      存放0x4000     (32位宽字节)

小端:0x4000:78    0x4001:56    0x4002:34    0x4003:12

大端:0x4000:12    0x4001:34    0x4002:56    0x4003:78

11、考虑n位二进制数,有多少个数中不存在两个相邻的1

a(n)=a(n-1)+a(n-2)

斐波那契数列:递归方法

long Fib(int i)

{

    if(i=1 || i=2)

         return 1;    //边界条件

    else

        return(Fib(i-1) + Fib(i-2));

}

12、不用除法操作,如何实现两个正整数的除法

我想的是倒数。。。不是还得用除法。。。。又想到想用移位操作。。。可惜不会。。。

先学习下位运算的相关知识

-n=~(n-1)=~n+1

获取整数n的二进制中的最后一个1:n&(-n)

去掉整数n的二进制中的最后一个1:n&(n-1)

题目:

第一种方法:一个一个的减去被除数,知道减==0或者<0

第二种方法:递归方法(看不懂啊)

第三种方法:移位操作

13、怎么写一个接受可变参数的函数

int add2(char num,...)

{

    int sun;

    int index;

    int *p=NULL;

    p=(int*)&num + 1;

    for(;index<num;index++)

    {

        sum+=*p++;

    }

    return sum;

}

14、函数指针和指针函数的区别是什么

函数指针:是指向函数入口地址的指针

指针函数:返回指针的函数

上面说对了哦。请区别:

指针数组、数组指针:(由指针组成的数组int *ap[8]  ==>  8个int* 的指针)(指向数组的指针int (*p)[8] ==>  指针指向数组,数组有8个int元素)

函数模板和模板函数:(重点是模板,是一系列模样相同的函数的说明,它不是某一个函数的具体说明)(在于函数,是数据参数类型确定下来的重载函数,是某一个具体函数)

指针常量和常量指针:(重点是常量,int * p)

15、C++函数传递参数的方式有哪些

传值、传址

值传递:实参形参不是同一存储单位

指针传递:本质还是值传递。只不过实参的值是变量的地址而已,函数过程中不是改变的实参的值,是实参地址指向的变量的值。

传引用:实参的地址传递到形参,使形参的地址取实参的地址,从而形成形参实参共享同一单元的形式。

全局变量传递:这里的全局指的是:变量的作用域足够这两个函数访问就可以了。比如同一个类的两个成员函数可以使用一个成员变量实现参数传递。

16、重载与覆盖有什么区别

重载是具有相同函数名,不同参数类型或者个数的函数;

覆盖是?(虚函数)

    重载是指函数具有不同的参数表,相同的函数名,然后编译器就认为是重载函数了。注意:重载不关注函数返回值;而且,对于重载函数的调用,在编译期间就已经确定了,是静态的,他的地址在编译期间就已经绑定了。与多态无关。

    成员函数被重载的特征如下:同一个类中、相同的函数名、不同的参数(类型或者个数)、virtual可有可无。

    覆盖是指派生类中存在重新定义基类的函数,其函数名、参数列、返回值类型必须同父类覆盖的函数严格一致。当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是父类中被覆盖的函数。他和多态真正的相关。当子类重新定义了父类的虚函数后,父类指针根据赋给他的不同子类指针,动态的调用属于该子类的该函数。这样函数的调用在编译期间是无法确定的,而是在运行期间动态的绑定的。

    覆盖的特征:不同的类(子类和父类)、只有函数体不同,其他的都相同(参数啊,函数名啊,等等),基类函数必须有virtual关键字

区别:一、重载和覆盖的范围不同。(重载是同一个类中的不同函数,覆盖是子类和父类之间的关系,不同类)

二、重载的参数列表不同;覆盖的参数列表相同。

三、重载可以是多个函数之间的关系;覆盖是两个函数之间的关系。

四、重载调用是根据参数的不同选择调用;覆盖调用是根据不同子类对象进行调用的。

 

#include <iostream>
using namespace std;

class Base
{
public:
    void f(int a )
    {
        cout<<"Base::f(int):"<<a<<endl;
    }
    void f(float a )
    {
        cout<<"Base::f(float):"<<a<<endl;
    }
    void g(void)
    {
        cout<<"Base::g()"<<endl;
    }
};

class Derived : public Base
{
public:
    void g(void)
    {
        cout<<"Derived::g()"<<endl;
    }
};

int main()
{
    Derived p;   //声明子类对象
    Base *pb=&p;//父类指针指向子类对象
    pb->f(5);
    pb->f(7.65f);//不加f不得,,,这里数据类型得显示的指出来
    pb->g();
    return 0;
}

 

看到了吧,实现了基类函数的隐藏。

(区分覆盖和隐藏关系)

隐藏注意两点:

一、名字相同,参数不同,基类有木有virtual都将会被隐藏。(此时都算不上覆盖,也不是重载,所以有木有virtual已经不重要了)

二、名字相同,参数相同,但是基类没virtual,此时基类函数被隐藏。(但是基类要有virtual就是覆盖了。)

 

17、是否可以通过绝对内存地址进行参数赋值与函数调用

可以的;传址方式

18、默认构造函数是否可以调用单参数构造函数

不清楚

19、C++ 中函数调用有几种方式

直接?间接?

20、什么是可重入函数?C++如何写可重入函数

概念都不懂啊。。。

21、int a[2][2] ={{1},{2,3}},则a[0][1]的值是多少

a[0][1]=0;

二维数组也就是俺理解的那样;主要关注的是一维的缺省。

int a[][3]={1,2,3,4,5,6,7,8,9};

int p[][3]={1,2,3,4,5,6,7};

int J[][3]={{1,2},{},{3,4,5}};

想缺省一维,注意必须要有:初始化数据。

22、如何合法的表示2维数组

23、a是数组,那么(int*)(&a+1)表示什么意思

取a数组首元素地址,一个int* 的指针指向首地址+1 的下一个位置。

24、不使用流程控制语句,如何打印出1-1000的整数

宏定义?构造函数?

默认构造函数和静态变量的结合:

看例子代码(求前N项和):

#include <iostream>
using namespace std;

class Temp
{
public:
    Temp();
    static void Reset();
    static int GetSum();
private:
    static int N;
    static int SUM;
};

int Temp::N=0;
int Temp::SUM=0;

Temp::Temp()
{
    N++;
    SUM+=N;
}
void Temp::Reset()
{
    N=0;
    SUM=0;
}

int Temp::GetSum()
{
    return SUM;
}

int Sum(int n)
{
    Temp::Reset();
    Temp *a = new Temp[n];   //   temp[0][1][......]
    delete[] a;
    a=NULL;     //防止产生野指针
    return Temp::GetSum();
}

int main()
{
    printf("%d\n",Sum(10));
    return 0;
}

 

25、char str[1024];scanf("%s",str)是否安全

不安全,可能会造成溢出

对,数组越界(超过1024的字符串)

26、行存储与列存储那种效率比较高

行的效率要高些;

是对的;C++就是行存储方案。主要是行存储的写入是一次完成,消耗时间少,数据的完整性因此可以确定。列存储需要把一行记录拆分成单列保存,写入次数明显比行存储多。所以行存储在写入上占有很大的优势。

转载于:https://www.cnblogs.com/westlife-11358/p/9393869.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值