【整理】关于C/C++语言面试题问答

本文整理了C++面试中常见的知识点,包括指针与引用的区别、memcpy与strcpy的不同、new与malloc的区别等,并介绍了内存分配的方式及其区别。此外还探讨了一些特殊的编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备找工作ing,题目不是我自己遇到的,都是网上整理来的,非常感谢各路网友的分享。

答案可能自己加工过,尽量保证正确全面,欢迎大家阅读后指正指点指教!

只涉及C C++两种语言,数据结构和算法另外单开一贴。


第一大类:指针和内存空间

Q: 指针和引用的区别

A:

1)指针定义时不一定要初始化,初始化后可以改变指向的对象;引用定义时必须初始化,不存在空引用,而且初始化后不能改变绑定对象;

2)指针是一种数据类型,系统为指针分配内存; 引用不是数据类型,引用是对象的别名,系统不为引用分配内存,引用与绑定对象共享内存;

3)使用指针访问绑定对象要解引用,是间接访问;使用引用访问绑定对象是直接访问;

4)向函数传形参的时候,指针本身是拷贝副本的,而引用不拷贝。


Q: memcpy和strcpy的区别

A:

1)strcpy和memcpy都是标准C库函数

2)复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等;
3)复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出;memcpy则是根据其第3个参数决定复制的长度;
4)用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy。

(http://www.cnblogs.com/stoneJin/archive/2011/09/16/2179248.html)

Q: new和malloc的区别,free和delete的区别

A:

1)malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符;所以malloc/free要库文件支持,new/delete则不要。

2)对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free;

3)new自动计算需要分配的空间,而malloc需要手工计算字节数;

4)new是类型安全的,而malloc不是,比如:
                 int* p = new float[2]; // 编译时指出错误
                 int* p = malloc(2*sizeof(float)); // 编译时无法指出错误

5)new将调用constructor,而malloc不能;delete将调用destructor,而free不能

6)在用delete 释放对象数组时,留意不要丢了符号‘[]’。

(http://blog.youkuaiyun.com/hackbuteer1/article/details/6789164)



Q: 指针在16位机、32位机、64位机分别占用多少个字节

A:

1)16位机 2字节; 32位机 4字节; 64位机 8字节。

2)函数指针可能会有例外。

(http://www.zhihu.com/question/19691905)

Q: 描述内存分配方式以及它们的区别

A:

1)有四个段(UNIX,从低地址到高地址顺序为):代码段(code/text segment)、数据段(data segment)或全局段(global segment)、堆(heap segment)和栈(stack segment)

2)其中 数据段 可以再分成:初始数据段(initialised data segment)和BSS数据段(block start by symbol data segments),两者也经常被叫做全局初始化区和全局未初始化区。

3)其中初始数据段还可以再分为只读区(read-only area)和读写区(read-write area),前者也叫做常量区,后者也叫做(狭义的)全局初始化区

4)代码段大小固定,只读,存放编译后的程序; 数据段(或全局段)大小固定,存放全局变量、静态变量、静态类和命名空间成员;

堆段比较大,有程序员显示的分配内存和释放内存;栈段比较小,存放局部变量,程序负责分配和释放内存。

5)没必要区分自由存储区(malloc/free)和堆区(new/delete),看不出意义。

6)如程序注释

inta =0;//全局初始化区

char *p1; //全局未初始化区 
int main() 
{
    int b; //栈 
    char s[] = "abc"; //栈 
    char *p2; //栈 
    char *p3 = "123456"; //123456\0在常量区,p3在栈上。 
    static int c = 0 //全局(静态)初始化区 
    p1 = (char *)malloc(10); 
    p2 = (char *)malloc(20); 
    //分配得来得10和20字节的区域就在堆区。 
    strcpy(p1, "123456"); 
    //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块。 
} 
(http://www-cs-faculty.stanford.edu/~eroberts/courses/cs106b/handouts/25-heap-stack-diagrams.pdf)

(http://blog.youkuaiyun.com/north23/article/details/3885168)

(http://www.questionscompiled.com/answer/cpp/3/memory-organization/)




第二大类:关键词和宏定义

第三大类:类、面向对象

Q: 面向对象的三大(四大)特性

A: 

1)封装、继承、多态、(抽象)。


第四大类:特殊技巧

Q: There are two int variables: a and b, don’t use “if”, “? :”, “switch”or other judgement statements, find out the biggest one of the two numbers.

A: ( ( a + b ) + abs( a – b ) ) / 2

这个效率高些,且不怕溢出;
a ^= b;
b ^= a;
a ^= b;




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值