淄博IT培训
美国上市IT培训机构

18300268127

热门课程

达内面试试题

  • 时间:2018-06-20 13:52
  • 发布:淄博it培训教学部
  • 来源:淄博it培训教学部

淄博IT培训小编讯

1.将下一个节点的内容复制到本节点上,然后删除下一个节点。

字符指针、浮点数指针、以及函数指针这三种类型的变量哪个占用的内存最大?为什么?

指针变量也占用内存单元,而且所有指针变量占用内存单元的数量都是相同的。就是说,不管是指向何种对象的指针变量,它们占用内存的字节数都是一样的,并且要足够把程序中所能用到的最大地址表示出来。

2.类ClassB从ClassA派生,那么ClassA *a = new ClassB(…); 试问该表达是否合法?为什么?

派生类的指针指向基类的对象是错误的,不能通过编译的;基类的指针可以指向派生类的对象,调用派生类的函数。

3.假设现有一个单向的链表,但是只知道只有一个指向该节点的指针p,并且假设这个节点不是尾节点,试编程实现删除此节点

4.如果ClassA中定义并实现虚函数int func(void),ClassB中也实现该函数,那么上述变量

a->func()将调用哪个类里面的函数?如果int func(void)不是虚函数,情况又如何?为什么?

第一问调用的是B的。第二问调用A的。

虚函数的一个典型应用,虚函数只能借助于指针或者引用来达到多态的效果

如果没有定义成虚函数:------

class A{

public:

void print(){ cout<<”This is A”<

};

class B:public A{

public:

void print(){ cout<<”This is B”<

};

int main(){ //为了在以后便于区分,我这段main()代码叫做main1

A a; B b;

A* p1=&a;

A* p2=&b;

p1->print();

p2->print();

}

结果是两个This is A

如果定义成虚函数:---------

class A{

public:

virtual void print(){ cout<<”This is A”<

};

class B:public A{

public:

void print(){ cout<<”This is B”<

};

再运行main输出的结果就是This is A和This is B。

5.char **p, a[16][8]; 问:p=a是否会导致程序在以后出现问题?为什么?

这个不会导致出现问题,但是要注意p的使用,如a[1][2] 等价的为 *(*(p+1)+2)而不是*(p+11),

会的,这样会出现编译错误 正确的是:char a[5][5]; char (*p)[5]; p=a;

6.应用程序在运行时的内存包括代码区和数据区,其中数据区又包括哪些部分?

对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区。动态数据区一般就是“堆栈”。栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”。全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。

7.用<<,>>,|,&实现一个WORD(2个字节)的高低位交换

int main()

{

unsigned short a = 0xABCD;

unsigned short b ;

unsigned short c, d;

b = (a << 8)&0xff00;

c = (a >> 8)&0x00ff;

d = b | c;

printf("\n%x",b);

printf("\n%x",c);

printf("\n%x",d);

return 0;

}

结果是 CDAB 2俩个字节是16位 前八位为高位 后八位为低位 然后结合

8.编写一个函数,函数接收一个字符串,是由十六进制数组成的一组字符串,函数的功能是把接到的这组字符串转换成十进制数字.并将十进制数字返回.

答案:

BOOL HexToDec( LPCTSTR shex, int& idec )

{

int i, mid;

int len = lstrlen( shex );

if( len > 8 )

return FALSE;

mid = 0; idec = 0;

for( i=0;i)

{

if( shex[i]>='0'&&shex[i]<='9' )

mid = shex[i]-'0';

else if( shex[i]>='a'&&shex[i]<='f' )

mid = shex[i] -'a' +10;

else if( shex[i]>='A'&&shex[i]<='F' )

mid = shex[i] -'A' +10;

else

return FALSE;

mid <<= ((len-i-1)<<2); // 移位表示变为2的n次方倍

idec =idc+mid;

}

return TRUE;

}

9.写一算法检测单向链表中是否存在环(whether there is a loop in a link list), 要求算法复杂度(Algorithm's complexity是O(n)) 并只使用常数空间(space is O(c)).

注意,你只知道一个指向单向链表头的指针。链表的长度是不定的,而且环出现的地方也是不定的,环有可能在头,有可能在中间。而且要求是检测, 不能破坏环的结构.(MOTO)

答:用两个指针来遍历这个单向链表,第一个指针p1,每次走一步;第二个指针p2,每次走两步;当p2指针追上p1的时候,就表明链表当中有环路了。

int testLinkRing(Link *head)

{

Link *t1=head,*t2=head;

while( t1->next && t2->next)

{

t1 = t1->;next;

if (NULL == (t2 = t2->next->next))

return 0; //无环

if (t1 == t2)

return 1;

}

return 0;

}

如果要定位环路在链表当中的开始点

发现p2和p1重合,确定了单向链表有环路了。接下来,让p2回到链表的头部,重新走,P1也继续走,每次步长都走1,那么当p1和p2再次相遇的时候,就是环路的入口了。

10.用最有效率的方法算出2乘以8等于几?

移位

上一篇:IT行业面试技巧
下一篇:企业面试常见试题

马上预约七天免费体验课

姓名:

电话:

企业面试常见视题

IT行业面试技巧

达内面试试题

选择城市和中心
贵州省

广西省

海南省

达内教育

有位老师想和您聊一聊