程序员面试宝典第七章总结——指针与引用

来源:互联网 发布:淘宝开店类目 知乎 编辑:程序博客网 时间:2024/05/29 04:45

7.1

面试题1: 

引用不能为空,必须总是指向某些对象。所以必须初始化。


面试题2:略。


7.2

面试题1:略。


面试题2:

编译器总是要为函数的每个参数制作临时副本。运行后,副本自动删除。

题目中,GetMemory(),先为str生成一个副本p,这个副本p先指向str所指向的位置, 当malloc一个区间给p后, p指向malloc的区间,但是函数结束后, 回收p,此时,没有将区间返回给str,因此会造成内存泄漏。


面试题3:

返回的结果是不确定且不安全,随时有被回收的可能。


面试题4:略。


面试题5:

本题考察的是对内存偏移的理解。B* pb=(B*)(&a);是将a强制转化成B类型,并将a的地址赋值给pb;也就是说pb指向的是类型为A的一篇内存空间。 因为B只有一个元素int m_c,编译器对m_c的认识就是m_c是对象的偏移量0。同时,A中的第一个m_a的偏移量也为0; 当调用pb->fun()时,调用的是B类型的fun()函数,函数输出m_c的值,由于编译器认为对象偏移量为0的就是m_c,所以这个时候输出的是m_a。

如果把两个类型颠倒过来,A变B,B变A,则输出的是3和一个任意数。

再若把题目改成如下:

class A{public:A(){m_a=1;m_b=2;}~A(){};void fun(){printf("%d%d",m_a,m_b);}private:int m_a;int m_b;};class B{public:B(){m_c=3;m_d=4;}~B(){};void fun(){printf("%d\n",m_c);}void fun1(){printf("%d\n",m_d);}private:int m_c;int m_d;};int main(int argc, char* argv[]){A a;B* pb=(B*)(&a);pb->fun1();return 0;}

则此时结果为2。


面试题6:

不能给一个指针分配一个随意的地址。


面试题7:略。


面试题8:

主函数main中可以不谢return语句,因为编译器会隐式返回0。但是在一般函数中没return语句是不行的。


面试题9:

当语句运行到s.p[1]=1时,这个时候s.p的指针就变成了指向地址空间为0x00000001的指针,这个时候再运行s.p[0]=2,则由于对于一个未做声明的地址直接访问,而访问出错


7.3

面试题1:略。


面试题2:

函数指针的声明:

void (*f)();

int max(int, int);int (*p)(int,int)=&max;orint max(int,int);int (*p)();p=max;


面试题3:略。


7.4

面试题1:略。


面试题2:略。


面试题3:略。


面试题4

两个区分开来

A代码区: 输出2 5

int main(int argc, char* argv[]){int a[]={1,2,3,4,5};int* ptr=(int*)(&a+1);printf("%d %d",*(a+1),*(ptr-1));return 0;}
B代码区:输出2 1

int main(int argc, char* argv[]){int a[]={1,2,3,4,5};int* ptr=(a+1);printf("%d %d",*(a+1),*(ptr-1));return 0;}


7.5

面试题1:

迷途指针,悬浮指针,失控指针,野指针。即当对一个指针进行delete操作后,虽然释放了它所指向的内存,但并没有把它设置为空。这个指针仍然指向原来的内存区域,但是编译器已经把这块内存区域分配给了其他的数据。再次使用这个指针会导致程序崩溃。


面试题2:略。


面试题3:略。


面试题4:略。


7.6

面试题1:略。


面试题2:

智能指针:auto_ptr是安全指针,在指针析构的时候,自动删除此指针。


7.7

面试题1:

1 this指针本质是一个函数参数,只不过隐藏起来了。针对的是一个类的实例。因此,this指针只能在成员函数中使用。全局函数、静态函数都不能使用this。

2 this在成员函数开始前构造,在成员的结束后清除

3 this指针不占用对象的空间,他只会占用参数传递时的栈空间,或者直接占用一个寄存器。

4 this是指向对象的常指针

具体看书!! 没法总结。


0 0
原创粉丝点击