50个C面试题

(1)变量的定义和声明有什么区别

为变量分配地址和存储空间的叫做变量的定义,不分配地址的成为声明。一个变量可以在多个地方声明,但是只能在一个地方定义。加入了extern修饰的变量的声明,说明此变量将在文件以外或在文件后面部分定义。

说明:很多时候一个变量,只是声明不分配内存空间,知道具体使用时才初始化,分配内存空间,如外部变量。

(2)写出bool、int、float、指针变量与“零值”比较的if语句

3sizeof 和strlen有以下区别

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

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

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

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

(4)C语言的关键词static和C++的关键词static有什么区别

在C中static用来修饰局部静态变量和外部静态变量、函数。

而C++除了上述功能外,还用来定义类的数据成员和成员函数。即静态成员和静态成员函数。

<静态变量的理解:静态变量属于静态存储方式,其存储空间为内存中的静态数据区,在静态存储区内分配存储单元,该区域中的数据在整个程序的运行期间一直占用这些存储空间,在程序整个运行期间都不释放(相反动态存储空间的话,函数调用结束后即释放)。静态变量虽在程序的整个执行过程中十种存在,但是她作用域之外不能使用。

>

(5)C++中的new与C中的malloc有什么区别

malloc与new 有一下区别:

1;new 和delete是操作符,可以重载,只能在C++中使用;

2;malloc和free是函数,可以覆盖,C,C++中都可以使用;

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

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

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

(6)写一个标准的宏MIN

#define MIN(a,b) ((a<=b)?:a,b)

(7)一个指针可以使volatitle吗

可以,因为指针和普通变量一样,有时也有变化程序的不可控性。常见例子:子中断服务子程序修改一个指向buffer的指针时,必须使用volatile来修饰这个指针

(8)a与&a的区别

main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}

输出结果是:2,5

&a+1不是首地址加1,系统会认为加了一个整个a数组,偏移了整个数组a的大小也就是a[5],因此ptr 实际上是&(a[5])

(9)简述C/C++程序编译的内存分配情况

1;从静态存储区域分配

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

2;从栈上分配

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

3;从堆中分配

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

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

(10)简述strcpy sprintf 与memcpy 的区别

三者主要有以下不同处(三者都可以实现拷贝功能)

1;操作对象不同。strcpy 的两个操作对象均为字符串,sprintf的操作源对象可以是多种数据类型,目的操作对象是字符串,memcpy的两个对象就是两个任意可操作的内存地址,并不限于何种数据类型

2;  执行效率不同,memcpy最高,strcpy次之,sprintf的效率最低

3;实现功能不同,strcpy主要实现字符串变量间的拷贝,sprintf主要实现其他数据类型格式到字符串的转化,memcpy主要是内存块间的拷贝。

(11)设置地址为0x76a9的整型变量的值为0xaa66

int *ptr;
ptr = (int*)0x76a9;
*ptr = 0xaa66;
说明:这道题就是强制类型转化的典型例子。

(12)面向对象的三大特征

面向对象的三大特征是封装性、继承性和多态性

1;封装性:将客观事物抽象成类,每个类对自身的数据和方法实现封装

2;继承性:广义的继承有三种实现形式:实现继承(使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承 (仅使用属性和方法,实现滞后到子类实现)

3;多态性:将父类对象设置成为和一个或者更多它的子对象相等的技术。用子类对象给父类对象赋值之后,父类对象就可以根据当前赋值给它的子对象的特性以不同的方式运作

(13)一个C++空类有哪些成员函数

1;缺省构造函数  2;缺省拷贝构造函数  3;缺省析构函数  4;缺省赋值运算符 5;缺省取址运算符  6;缺省取址运算符 const

(14)谈谈你对拷贝构造函数和赋值运算符的认识

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

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

2;由于拷贝





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值