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

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;

or

int 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值