C/C++面试题目+ Algorithmic interview

algorithmic
数组中只出现一次的数(其它数出现k次)

来源
看看他的也
来源C Primer Plus
1、P328 c语言中的静态变量只在编译的时候被初始化一次,放在函数内部是说只有这个函数能看到他,比如对这个静态变量叠加操作,它会每次都叠加的,因为只在编译时初始化。
register 暗示编译程序这个变量会被频繁使用,应放在CPU寄存器中,加快其存储速度。一般用来做形参和局部变量
extern表示其定义在别的文件中
示例程序 P334
2、*ptr &ptr=指针的地址 ptr=指针的值也是它指向的地址 *ptr=指向这块内存地址的值 一共四个,两组数,其中两个是一样的

3、宏和函数。
宏使用起来更快,但是费空间,函数由于调用20次,只是用的拷贝,所以慢,节省空间。而宏产生内联代码,将20行代码插入到程序中

4、exit()会在程序终止时调用,atexit(方法名:也就是地址),程序正常退出时候调用,先输出最后添加进去的函数(先进后出的原则)

5、转换说明bai及作为结果的打印du输出%a 浮点数、十六进制zhi数字和p-记数法(daoC99)zhuan
%A 浮点数、十六进制数字和shup-记法(C99)
%c 一个字符
%d 有符号十进制整数
%e 浮点数、e-记数法
%E 浮点数、E-记数法
%f 浮点数、十进制记数法
%g 根据数值不同自动选择%f或%e.
%G 根据数值不同自动选择%f或%e.
%i 有符号十进制数(与%d相同)
%o 无符号八进制整数
%p 指针
%s 字符串
%u 无符号十进制整数
%x 使用十六进制数字0f的无符号十六进制整数
%X 使用十六进制数字0f的无符号十六进制整数
%% 打印一个百分号 使用printf ()函数 printf()的基本形式: printf(“格式控制字符串”,变量列表);


面试题 1:变量的声明和定义有什么区别
只声明不分配内存空间,直到使用时
为变量分配内存空间的称为定义
面试题 3:sizeof 和 strlen 的区别
sizeof 是一个操作符,strlen 是库函数。sizeof 计算的是数据类型占内存的大小,而 strlen 计算的是字符串实际的长度。

面试题 5:C中的 malloc 和C++中的 new 有什么区别
(1) new、delete 是操作符,可以重载,只能在 C++中使用。
(2) malloc、free 是函数,可以覆盖,C、C++中都可以使用。
malloc 申请的内存空间要用 free 释放,而 new 申请的内存空间要用 delete 释放,不要混用。
面试题 6:写一个“标准”宏 MIN
#define min(a,b)((a)<=(b)?(a):(b))
面试题 8 指针练习题好好做做
面试题 9:简述 C、C++程序编译的内存分配情况
C、C++中内存分配方式可以分为三种:
(1) 从静态存储区域分配:
内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。速度快、不容易出错,因为有系统会善后。例如全局变量,static 变量等。
(2) 在栈上分配:
在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配:
即动态内存分配。程序在运行的时候用 malloc 或 new 申请任意大小的内存,程序员自己负责在何时用 free 或 delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活。如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,另外频繁地分配和释放不同大小的堆空间将会产生堆内碎块。
一个 C、C++程序编译时内存分为 5 大存储区:堆区、栈区、全局区、文字常量区、程序代码区
(4)文字常量区:char *c = “123456”;则”123456”为文字常量,存放于文字常量区
(5)程序代码区:存放函数体的二进制代码

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。

内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

memory leak会最终会导致out of memory!

10:简述 strcpy、sprintf 与 memcpy 的区别
三者主要有以下不同之处:
(1) 操作对象不同,strcpy 的两个操作对象均为字符串,sprintf 的操作源对象可以是多种数据类型,目的操作对象是字符串,memcpy 的两个对象就是两个任意可操作的内存地址,并不限于何种数据类型。
(2) 执行效率不同,memcpy 最高,strcpy 次之,sprintf 的效率最低。
(3) 实现功能不同,strcpy 主要实现字符串变量间的拷贝,sprintf 主要实现其他数据类型格式到字符串的转化,memcpy 主要是内存块间的拷贝。

面试题 11:设置地址为 0x67a9 的整型变量的值为 0xaa66
int *ptr; ptr = (int *)0x67a9;//地址值
*ptr = 0xaa66; //数值
无论什么平台地址长度和整型数据长度一样

面试题 12:面向对象的三大特征
1、封装:private,protected,public
2、继承:父子
3、多态:虚函数,接口,函数重载,同样的东西能产出不同的东西
面试题 15:用 C++设计一个不能被继承的类
构造函数是继承的关键,每次子类对象构造时,首先调用父类的构造函数,然后才是自己的
面试题 18:简述多态实现的原理
1、静态多态就是重载,编译时就确定函数地址
2、动态多态虚函数,运行时在虚函数表中寻找调用函数的地址
面试题 19:链表和数组有什么区别
数组擅长不动,链接擅长动
1、数组连续的内存空间,声明时就要确定长度。链表动态空间,长度可变
2、数组查找快。链表擅长插入,删除
3、数组会越界,链表不会
面试题 21:简述队列和栈的异同
1、两个都是线性存储结构—队列:先进先出;栈:后进先出
2、内存存储区域—栈区自动分配释放,存放函数的参数值,局部变量的值等。堆区程序员分配释放
面试题 27:几个排序有时间看一下
面试题 29:谈谈你对编程规范的理解或认识
编程规范可总结为:程序的可行性,可读性、可移植性以及可测试性。

面试题 31:&&和&、||和|有什么区别
(1)&和|对操作数进行求值运算,&&和||只是判断逻辑关系。
|和&,0和1相或为1,相与为0,0和0相与相或都为0,1和1相与相或都为1
(2)&&和||在在判断左侧操作数就能确定结果的情况下就不再对右侧操作数求值。
面试题 32:C++的引用和 C 语言的指针有什么区别
在C和C++中,指针一般指的是某块内存的地址,通过这个地址,我们可以寻址到这块内存;而引用是一个变量的别名,例如我们给小明起了个外号:明明,那我们说明明的时候,就是说小明。

面试题 35:typedef 和 define 有什么区别
1、typedef用来定义一种数据类型的别名,增强可读性。define用来定义常量,以及书写复杂使用频繁的宏。[比如上面的MIN]
面试题 36:关键字 const 是什么
1、const修饰的参数不能被改变
面试题 37:extern 有什么作用
extern标识的变量/函数定义在别的文件中,提示编译器遇到他们在其他模块寻找其定义。
面试题 40:简述指针常量与常量指针区别
指针常量强调的是指针的值从初始化开始不可变。常量指针强调的是指针所指对象的值不可改变。他们最大的用途是作为函数的形式参数,保证实参在被调用时不可变。

面试题 41:数组名和指针的区别
#include <iostream.h>
#include <string.h>
void main(void)
{
char str[13]=“Hello world!”;
char *pStr=“Hello world!”;
cout<<sizeof(str)<<endl;
cout<<sizeof(pStr)<<endl;
cout<<strlen(str)<<endl;
cout<<strlen(pStr)<<endl;
return;
}

打印结果:13 4 12 12
strlen和sizeof有什么区别?
1、sizeof是运算符,编译时即计算好了。返回值为:数组——编译时分配的数组空间大小;指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4)
2、strlen是函数,运行时才能计算。参数必须是字符型指针。数组名作为参数输入时,数组就退化成指针。返回字符串的长度

面试题 42:如何避免“野指针”
1、什么是野指针?

未初始化的指针,随机指向一块内存

2、如何避免野指针?

养成良好的编码习惯:

1)当指针没有确切指向要置空;

2)当要给指针指向的空间赋值时要给它分配空间;

3)检查空间分配是否成功;

4)分配成功情况空间;

5)释放空间;

6)释放后指针再置为空。

3、危害
你家里有个物体,不知什么时候突然出现,也不知什么时候突然消失。会把你的东西乱挪位置,还时不时打碎个瓶子。这个物体,在计算机的世界叫野指针。在现实世界,叫猫。

面试题 43:常引用有什么作用
const 类型标识符 &引用名=目标变量名
需要常引用作为形参,不能在函数中改变实参的值


44、float 和指针变量0值比较
const float num=0.00001
if((flag >=-num)&&(flag<=num))

if(NULL==flag)


https://blog.csdn.net/kuweicai/article/details/82779648
一、
1、堆和自由存储区的区别
堆是C语言和操作系统的术语,一块特殊内存,运行malloc()分配内存,运行free将内存归还
自由存储是C++中通过new和delete动态分配和释放对象的概念
2、编译:将C/C++源代码转变成计算机能执行的代码的过程:预处理,编译,汇编,链接【可执行二进制程序】
3、计算机如何存储负数和浮点数,在内存中
负数:通过标志位和补码来表示
浮点分单精度float 32bit, 双精度 double 64bit 符号位,指数位(科学计数法),尾数部分
4、内存泄漏,malloc了,没有free

二、
C v.s. C++
1、C面对的是过程,我们编程的着眼点在过程
C++是面向对象编程

2、int fun() 和 int fun(void)的区别?
C中,返回值是int,前者对输入类型和个数没有限制,后者输入为void
C++中两种情况都是返回int,输入类型为void

3、const定义的是不能修改它的值的,只读的,或者常量
C中可以通过指针修改const变量,【仅从编译时限制,运行期无效】。C++中不能修改const变量
C语言中只有enum可以实现真正的常量
4、宏和内联(inline)函数的比较?
1)宏是C中一种预处理功能
2)内联函数是C++的使用的,推荐用内联函数来替换宏
3)内联函数将函数体直接扩展到调用内联函数的地方,减少了参数压栈,跳转,返回等过程
4)内联发生在编译阶段,所以相比较于宏,是有参数和返回值检查的,使用起来更安全

5、C++中有了malloc / free , 为什么还需要 new / delete?
1)前者是标准库函数,后者是C++中操作符,都可以动态申请内存和释放内存
2)malloc需要库支持,在一些简易的平台不支持,new是C++自带的运算符,没这问题,malloc【只申请内存空间】无法满足对象,对象在创建时自动执行构造函数,消亡时析构函数,new可以完成这个初始化工作

6、C和C++中的强制类型转换?
C语言是直接加小括号,缺少检查,编译和人工难发现
C++引入了四种转换
基本类型转换,具有继承关系的类指针间转换,指针间的,去掉变量const属性的

7、static

  1. 静态成员变量需要在类内声明(加static),在类外初始化(不能加static),如下例所示;
  2. 静态成员变量在类外单独分配内存空间,位于全局数据区,所以不依赖于某个对象,被所有对象共享。
    class example{
    private:
    static int m_int; //static成员变量
    };

int example::m_int = 0; //没有static

cout<<example::m_int; //可以直接通过类名调用静态成员变量

静态成员函数
它不能访问普通成员变量
class example{
private:
static int m_int_s; //static成员变量
int m_int;
static int getI() //静态成员函数在普通成员函数前加static即可
{
return m_int_s; //如果返回m_int则报错,
}
};

cout<<example::getI(); //可以直接通过类名调用静态成员变量

8、在C++程序中调用被C编译器编译后的函数,为什么要加extern“C”?
C++语言支持函数重载,C不支持,函数被C++编译器编译后在库中的名字和C语言的不同,比如_foo, _foo_int_int,为了解决此类名字匹配的问题。

9、头文件中的 ifndef/define/endif 是干什么用的? 该用法和 program once 的区别?
相同点:
它们的作用是防止头文件被重复包含。
program once更快,而且可以防止多名程序员造成的宏名字“撞车”

10、i++和++i的考点比较多,简单来说,就是i++返回的是i的值,而++i返回的是i+1的值
分清返回值和i的值的区别
int main()
{
int i = 1;
printf("%d,%d\n", ++i, ++i); //3,3
printf("%d,%d\n", ++i, i++); //5,3
printf("%d,%d\n", i++, i++); //6,5
printf("%d,%d\n", i++, ++i); //8,9
system(“pause”);
return 0;
}

三、数组、指针 & 引用
1、引用不能为空,只能在定义时被初始化一次,之后不可变,是某块内存的别名
2、引用占内存空间,占的和指针一样,因为内部就是通过指针来完成的
3、数组指针—指向数组的指针 指针数组—该数组的元素均为指针。

四、C++特性
1、面对对象就是以对象为中心构建可复用的软件系统
2、拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象
class Line
{
public:
int getLength( void );
Line( int len ); // 简单的构造函数
Line( const Line &obj); // 拷贝构造函数
~Line(); // 析构函数

private:
int *ptr;
};

3、什么时候生成默认构造函数(无参构造函数)?什么时候生成默认拷贝构造函数?什么是深拷贝?什么是浅拷贝?默认拷贝构造函数是哪种拷贝?什么时候用深拷贝?

  1. 没有任何构造函数时,编译器会自动生成默认构造函数,也就是无参构造函数;当类没有拷贝构造函数时,会生成默认拷贝构造函数。
    2)浅拷贝就是默认的拷贝构造函数,深拷贝是对含有指针成员的对象进行拷贝时,必须自己定义拷贝构造函数,使拷贝后的指针成员有自己的内存空间,避免两个指针指向同一块内存,被释放两次的问题
  1. 构造函数和析构函数的执行顺序?
    1)调用父类的构造函数
    2)调用成员变量的构造函数
    3)类自身的
    析构函数
    对于栈对象或者全局对象调用顺序正好相反,对于堆对象,析构和delete顺序相关

5、多态为了应对变化,继承为了少写重复代码,设计模式为了条理清楚,解耦合,封装也是少写重复代码,模块化

6、C++的编译环境
如下图所示,C++的编译环境由如下几部分构成:C++标准库、C语言兼容库、编译器扩展库及编译模块【C++标准语法模块,C++扩展语法模块】。
#include //C++标准库,不带".h"
#include<string.h> //C语言兼容库,由编译器厂商提供
C语言兼容库功能上跟C++标准库中的C语言子库相同,它的存中主要为了兼容C语言编译器,也就是说如果一个文件只包含C语言兼容库(不包含C++标准库),那么它在C语言编译器中依然可以编译通过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值