您的位置:首页 > 其它

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

2015-05-30 10:12 393 查看
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]
和释放


分析:

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

/article/7983458.html

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

方法有两种:参考博客:/article/2003007.html

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

//定义p[m]

int **p=new int *[m];
for (int i=0;i<m;i++)
{
p[i]=new int
;
}
//初始化
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]

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).叙述全局静态变量和全局变量的区别,局部静态变量和局部变量的区别,静态函数与非静态函数的区别

参考答案:/article/5871962.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).类的前向声明有什么作用?

参考博客:

/article/2353877.html

/article/2736650.html

/article/3766541.html

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

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

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

http://www.cnblogs.com/supers/articles/1229078.html

7).谈谈进程同步与互斥

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源,如“第一类读写者模型”。参考博客:
/article/9329052.html

/article/4677412.html


8)编程题:

取石子问题,有1堆n个的石子,每次只能取{1,3,4}个石子,先取完石子者胜利,那么先手胜还是后手胜?

这是博弈论的问题,可参考

/article/6913470.html

/article/2565975.html

808020804
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: