`
zhangziyangup
  • 浏览: 1072657 次
文章分类
社区版块
存档分类
最新评论

C/C++经典面试50题(挑重点整理)

 
阅读更多

面试题3sizeofstrlen的区别

sizeofstrlen有以下区别:

sizeof是一个操作符,strlen是库函数。

sizeof的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为‘\0‘的字符串作参数。

编译器在编译时就计算出了sizeof的结果。而strlen函数必须在运行时才能计算出来。并且sizeof计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度。

数组做sizeof的参数不退化,传递给strlen就退化为指针了。

注意:有些是操作符看起来像是函数,而有些函数名看起来又像操作符,这类容易混淆的名称一定要加以区分,否则遇到数组名这类特殊数据类型作参数时就很容易出错。最容易混淆为函数的操作符就是sizeof

strlen()sizeof()考点,一步到位!

看下msdn的官方解释:

Strlen——Get the length of a string.

size_t strlen( const char *string );

Each ofthese functions returns the number of characters in string, notincluding the terminating null character.

函数返回string里的字符数,不包括终止字符’\0’

sizeof Operator 运算符

sizeof expression

The sizeofkeyword gives the amount of storage, in bytes, associated with a variable or atype (including aggregate types). This keyword returns a value of type size_t.

//返回变量或类型(包括集合类型)存储空间的大小,

The expressionis either an identifier or a type-cast expression (a type specifier enclosed inparentheses).

When appliedto a structure type or variable, sizeof returns the actual size, whichmay include padding bytes inserted for alignment. When applied to a staticallydimensioned array, sizeof returns the size of the entire array. The sizeofoperator cannot return the size of dynamically allocated arrays or externalarrays.

//应用结构体类型或变量的时候,sizeof()返回事实的大小,包括为对齐而填充字节。当应用到静态数组时,sizeof()返回整个数组的大小。sizeof()不会返回动态分配数组或扩展数组的大小。

char str[] = “Hello” ;

char *p = str ;

int n = 10;

请计算

sizeof (str) = //5 str所占据的存储空间大小

sizeof ( p )= //4 指针类型

sizeof ( n )= //4 整形占据的存储空间

void Func ( char str[100])

{

请计算

sizeof( str ) = //4 此时str转化为指针大小仍为4

}

void *p = malloc( 100 );

请计算

sizeof ( p ) = //4 指针大小4

面试题5:C中的malloc和C++中的new有什么区别

mallocnew有以下不同:

1newdelete是操作符,可以重载,只能在C++中使用。

2mallocfree是函数,可以覆盖,CC++中都可以使用。

3new可以调用对象的构造函数,对应的delete调用相应的析构函数。

4malloc仅仅分配内存,free仅仅回收内存,并不执行构造和析构函数

5newdelete返回的是某种数据类型指针,mallocfree返回的是void指针。

注意:malloc申请的内存空间要用free释放,而new申请的内存空间要用delete释放,不要混用。因为两者实现的机理不同。

面试题8a&a有什么区别

请写出以下代码的打印结果,主要目的是考察a&a的区别。

#include<stdio.h>

void main( void)

{

inta[5]={1,2,3,4,5};

int*ptr=(int *)(&a+1); //此处&a是数组的指针,1实际1个数组长度 1*5*4 = 20个字节;

int*ptr2 = (int *)(a+1);

printf("%d,%d\n",*(a+1),*(ptr-1)); //

printf("%d,%d\n",*(a+1),*(ptr2-1));

}

注意:数组名a可以作数组的首地址,而&a是数组的指针。对比上两式子的不同。

&a+1,&a为代表a数组的指针1根据&a变化代表了int a[5]数组的大小,为4*5=20个字节。

a+1, a代表数组a的首地址,1代表数组a1个元素的长度,为4个字节。

int *ptr = (int *)(&a + 1),代表ptr指向a数组20个字节后的一块内存区域,显然,该内存区域未定义,为一个随机值。而*(ptr-1),此处ptr减去1*4个字节长度,*(ptr-1)指向a[5];

int *ptr2 = (int *)(a+1),代表指向数组首地址1*4个字节后元素,即a[1] = 2;ptr2指向a[2],此处的*a = *(a+0) = a[0], *(a+1) = a[1],依次类推。

面试题9:简述CC++程序编译的内存分配情况

CC++中内存分配方式可以分为三种:

1)从静态存储区域分配:

内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。速度快、不容易出错,因为有系统会善后。例如全局变量,static变量等。

2)在栈上分配:

在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限

3)从堆上分配:

即动态内存分配。程序在运行的时候用mallocnew申请任意大小的内存,程序员自己负责在何时用freedelete释放内存。动态内存的生存期由程序员决定,使用非常灵活。如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,另外频繁地分配和释放不同大小的堆空间将会产生堆内碎块。

一个CC++程序编译时内存分为5大存储区:堆区、栈区、全局/静态区、文字常量(字符常量)区、程序代码区。

面试题11:设置地址为0x67a9的整型变量的值为0xaa66

int *ptr;

ptr = (int *)0x67a9;

*ptr = 0xaa66;

说明:这道题就是强制类型转换的典型例子,无论在什么平台地址长度和整型数据的长度是一样的,即一个整型数据可以强制转换成地址指针类型,只要有意义即可

但是,此处的转换,编译没有问题,但是运行的时候可能会出错。因为Ox67a9这块地址可能被占用……

面试题13C++的空类有哪些成员函数

1)缺省构造函数。

2)缺省拷贝构造函数。

3)缺省析构函数。

4)缺省赋值运算符。

5)缺省取址运算符。

6)缺省取址运算符 const

注意:有些书上只是简单的介绍了前四个函数。没有提及后面这两个函数。但后面这两个函数也是空类的默认函数。另外需要注意的是,只有当实际使用这些函数的时候,编译器才会去定义它们。

面试题14:谈谈你对拷贝构造函数和赋值运算符的认识

拷贝构造函数和赋值运算符重载有以下两个不同之处:

1)拷贝构造函数生成新的类对象,而赋值运算符不能。

2)由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象是否和新建对象相同。而赋值运算符则需要这个操作,另外赋值运算中如果原来的对象中有内存分配要先把内存释放掉

注意:当有类中有指针类型的成员变量时,一定要重写拷贝构造函数和赋值运算符,不要使用默认的。

面试题15:用C++设计一个不能被继承的类

class A

{

private:

A() {}

~A() {}

};

class B : virtual public A

{

public:

B(){}

~B(){}

};

class C : virtual public B

{

public:

C() {}

~C() {}

};

void main( void )

{

B b;

//C c;

return;

}

注意:构造函数是继承实现的关键,每次子类对象构造时,首先调用的是父类的构造函数,然后才是自己的。

此处,如果将父类构造函数写成私有的,便不能完成继承操作。这是考察点。

待完善!加油!2012/7/27 向原作者致敬!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics