某著名公司2015暑期实习招聘试题及相关内容复习

1.)输出下面的结果

<pre name="code" class="cpp">#include <iostream>
using namespace std;


int main(int argc, char *argv[])
{
	int **a[5][4];
        int *b[5][4];
	int *c[5];
	int d[5][4];
	char *e="helloworld";
	char g[]="0123456789";
	char f[20]="helloworld";
	cout<<sizeof(a)<<endl;
	cout<<sizeof(b)<<endl;
	cout<<sizeof(c)<<endl;
	cout<<sizeof(d)<<endl;
	cout<<sizeof(e)<<endl;
	cout<<sizeof(g)<<endl;
	cout<<sizeof(f)<<endl;
	return 0;
}

 答案: 
80
80
20
80
4
11
20
请按任意键继续. . .

分析:前三个数组都是指针数组,存放的是指针,指针的大小不论什么类型都是4个字节,因此它的大小为4*number(数组)。后面sizeof(g)共11个字符,因为还有一个'\0'.因此大小为11.

另外本类型的题,除了经常考察指针以外,对于类或结构体中的大小也经常考察,因为其中涉及中了内存对齐,可参考博客http://www.cnblogs.com/longlybits/articles/2385343.html

2.)定义 int** p=NULL,如何动态分配二维

数组p[m][n]和释放

分析:

由于本题事先给定了p,所以必须使用数组的方式分配二维数组,否则我强烈建议使用vector来分配二维数组,使用vector的好处很多,如可以随时改变动态分配数组的大小,不需要手动释放内存等,可参考博客:
http://blog.csdn.net/zsuguangh/article/details/6135529

现在回到使用数组的方式类分配二维数组。

方法有两种:参考博客:http://blog.csdn.net/lavorange/article/details/42879605

一、二维数组的动态分配(内存不连续)

//定义p[m][n]
	int **p=new int *[m];
	for (int i=0;i<m;i++)
	{
		p[i]=new int[n];
	}
	//初始化
	for (int i=0;i<m;i++)
	{
		
		memset(p[i],0,sizeof(int)*n);
	}
   //释放内存
	for (int i=0;i<m;i++)
	{
      delete[] p[i];
	  p[i]=0;//注意释放时要将指针赋值为0,以免指针成为迷途指针
	}
	delete[] p;
	p=0;

808020804
二、二维数组的动态分配(内存连续)

//定义p[m][n]
     int **p=new int *[m];
	 p[0]=new int[m*n];
	 for (int i=1;i<m;i++)
	 {
		 p[i]=p[i-1]+n;
	 }
//初始化
	 memset(p[0],0,sizeof(int)*n*m);
  //释放内存
    delete[] p[0];
    p[0]=0;
	delete[] p;
	p=0;
3.)叙述堆和栈的区别

参考答案:

1.栈的空间由操作系统自动分配与释放,堆的空间手动分配与释放;

2.栈的空间有限,堆是很大的自由存储区:

3.c中的malloc函数分配的内存空间即在堆上,而C++中对应的是new 操作符;

4.程序在编译期对变量和函数分配内存都在栈上进行,且程序的运行过程中函数调用时参数传递也在栈上进行。

4).叙述全局静态变量和全局变量的区别,局部静态变量和局部变量的区别,静态函数与非静态函数的区别

参考答案:http://www.cnblogs.com/chenglei/archive/2009/09/06/1561367.html

http://blog.sina.com.cn/s/blog_9d38f2eb01010f76.html

C++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域

作用域看:

全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包括全局变量定义的源文件需要用extern关键字再次声明这个全局变量。

静态局部变量具有局部作用域。它只被初始化一次,自从第一次初始化直到程序运行结束都一直存在,他和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。

局部变量也只有局部作用域,他是自动对象,他在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用结束后,变量就被撤销,其所占用的内存也被收回。

静态全局变量也具有全局作用域,他与全局变量的区别在于如果程序包含多个文件的话,他作用于定义它的文件里,不能作用到其他文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同的静态全局变量,他们也是不同的变量。

从分配内存空间看:

全局变量、静态局部变量、静态全局变量都在静态存储区分配空间,而局部变量在栈分配空间。

全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上没有什么不同。区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其他源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其他源文件中引起错误。

1、静态变量会被放在程序的静态数据存储区里,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是他与堆栈变量和堆变量的区别

2、变量用static告知编译器,自己仅仅在变量的作用域范围内可见。这一点是他与全局变量的区别。

从以上分析可以看出,把局部变量改变为静态变量后是改变了他的存储方式,即改变了他的生存期。把全局变量改变为静态变量后是改变了他的作用域,限制了他的使用范围,因此static这个说明符在不同的地方起的作用是不同的。

TIPS:

1、若全局变量仅在单个文件中访问,则可以讲这个变量修改为静态全局变量。

2、若全局变量仅在单个函数中使用,则可以将这个变量修改为该函数的静态局部变量。

3、全局变量、静态局部变量、静态全局变量都存放在静态数据存储区。

4、函数中必须要使用static变量的情况:当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

5).类的前向声明有什么作用?

参考博客:
http://blog.csdn.net/yunyun1886358/article/details/5672574

http://blog.csdn.net/fg2006/article/details/6234973
http://qimo601.iteye.com/blog/1406992

主要用于在一个类的声明中需要另一个类的定义时,但是这时并不需要知道类的大小和成员操作等信息,只需要知道这是一个类时,可以用前置声明来告诉编译器这是个类即可,常用于两个类相互包含的情况,比如a类在声明时定义了b类的对象,而b类在声明中定义了a类的引用或指针时,这时需要b类在声明时,由于是a类的引用或指针,大小是固定的,且不需要知道a类的大小和成员的操作等信息,因此只要做a的前置声明(class a)就可以了。

6).谈谈面向对象的编程的理解

面向对象的基本观点 :客观世界由对象组成,任何客观实体都是对象,复杂对象可以由简单对象组成。具有相同数据和操作的对象可以归纳成类,对象是类的实例。类可以派生出子类,子类除了父类的全部特性外还有自身的特性。对象之间的联系通过消息来联系,类的封装性决定了其数据只能通过消息请求调用可见方法来访问。
http://www.cnblogs.com/supers/articles/1229078.html
7).谈谈进程同步与互斥

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源,如“第一类读写者模型”。

参考博客: http://blog.csdn.net/f81892461/article/details/8648122
http://www.cnblogs.com/CareySon/archive/2012/04/14/Process-SynAndmutex.html
 
8)编程题:
取石子问题,有1堆n个的石子,每次只能取{1,3,4}个石子,先取完石子者胜利,那么先手胜还是后手胜?
这是博弈论的问题,可参考

http://www.cnblogs.com/frog112111/p/3199780.html

http://blog.csdn.net/acm_cxlove/article/details/7854530











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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值