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

简介: sizeof和strlen有以下区别: sizeof是一个操作符,strlen是库函数。

面试题3:sizeof和strlen的区别


sizeof和strlen有以下区别:


    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 instring, notincluding the terminating null character.


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



sizeof Operator 运算符


sizeofexpression


The sizeofkeyword gives the amount of storage, in bytes, associated with a variable or atype (including aggregate types). This keyword returns a value of typesize_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+1=6 ,注意1代表'\0'容易落下,代表结束符。 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有什么区别


malloc和new有以下不同:


(1)new、delete是操作符,可以重载,只能在C++中使用。


(2)malloc、free是函数,可以覆盖,C、C++中都可以使用。


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


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


(5)new、delete返回的是某种数据类型指针,malloc、free返回的是void指针。


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



面试题8:a和&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代表数组a中1个元素的长度,为4个字节。


int *ptr = (int *)(&a + 1),代表ptr指向a数组20个字节后的一块内存区域,显然,该内存区域未定义,为一个随机值。而*(ptr-1),此处ptr减去1*4个字节长度,ptr-1指向a[5],*(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:简述C、C++程序编译的内存分配情况


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


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


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


(2)在栈上分配:


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


工作中讨论问题都叫栈变量。


(3)从堆上分配:


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


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



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


int *ptr;


ptr = (int *)0x67a9;


*ptr = 0xaa66;


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


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



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


      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 向原作者致敬!


感谢网友shunqiziranhao007 的指正!

————————————————

版权声明:本文为CSDN博主「铭毅天下」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/laoyang360/article/details/7795610

相关文章
|
1月前
|
安全 JavaScript 前端开发
C/C++面试题:如何理解多态?
C/C++面试题:如何理解多态?
24 0
|
1月前
|
编译器 C++ Python
【C/C++ 泡沫精选面试题02】深拷贝和浅拷贝之间的区别?
【C/C++ 泡沫精选面试题02】深拷贝和浅拷贝之间的区别?
32 1
|
2月前
|
C++
C/C++工程师面试题(指针篇)
C/C++工程师面试题(指针篇)
50 0
|
1月前
|
敏捷开发 安全 API
C/C++ 工程师面试:如何精彩展示你的项目经验并获得高分
C/C++ 工程师面试:如何精彩展示你的项目经验并获得高分
73 0
|
1月前
|
消息中间件 存储 算法
【C/C++ 泡沫精选面试题04】在实际项目中,多进程和多线程如何选择?
【C/C++ 泡沫精选面试题04】在实际项目中,多进程和多线程如何选择?
43 1
|
1月前
|
编解码 缓存 安全
【C/C++ 泡沫精选面试题03】谈谈C/C++ 智能指针?
【C/C++ 泡沫精选面试题03】谈谈C/C++ 智能指针?
31 1
|
1月前
|
缓存 算法 编译器
【C/C++ 泡沫精选面试题01】提高c++性能,你用过哪些方式去提升?
【C/C++ 泡沫精选面试题01】提高c++性能,你用过哪些方式去提升?
38 1
|
1月前
|
设计模式 C++
C++设计模式:面试题精选集
C++设计模式:面试题精选集
93 0
|
2月前
|
存储 编译器 程序员
近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)
近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)
107 0
|
2月前
|
算法 编译器 C++
C/C++面试题之语言基础篇(二)
C/C++面试题之语言基础篇(二)
58 0

热门文章

最新文章