c和c++基础

基础面试题:

1.new delete malloc free 的区别:

①new和delete是运算符。
new在对基本类型进行空间分配时,先分配空间,然后再根据括号后的值对其进行初始化,new分配空间时不用类型转化,后面直接指定了变量类型;在对自定义类型分配空间时,先分配空间,再调用自定义类型的构造函数对其进行初始化。
基本类型,delete直接释放空间;自定义类型,delete先调用自定义类型的析构函数,再释放空间。

②malloc和free是标准库函数。
malloc只是分配空间,并返回首地址,且不能给自定义类型分配空间;需要强制类型转化为想要的类型。
free只是将空间释放并标记此空间为可用。

2.inline内联函数和宏定义的区别:

inline和宏定义都能节省由于函数调用而产生的时间空间上的开销,提高程序执行效率;

inline的本质是函数,而宏定义只是简单的字符串(文本)替换;
宏定义在预编译期执行,inline在编译期,因此inline有类型检查和类型转化,而宏定义没有;
inline作为类的成员函数时,可以访问类中所有所有成员,宏定义不行;
inline的函数体不能过大,不能有循环,不能有过多判断,否则代码膨胀。

内联函数必须在定义时使用inline;
宏定义一定要多用括号,避免由于运算符优先级的问题,导致结果与预期不符。

3.sizeof内存对齐问题:

处理结构体中成员时,成员在内存中起始地址编码必须是成员类型所占字节数的整数倍;
结构体sizeof的计算结果必须是结构体中占用空间最多的成员所占空间的整数倍。

example:
struct s1 struct s2
{ {
int a; 4 char a; 2
double b; 8 short b; 2
short c; 4 double c; 8
char d; 4 int d; 4
}; };

sizeof(struct s1)=16;

4.位运算

交换两个数的值,不用中间变量:

a = a-b;
b = a+b;
a = b-a;
或者
a = a^b;
b = a^b;
a = a^b;

计算二进制中1的个数:

void count(int n)
{
for(count = 0;n != 0;n>>1)
{
if(n&1)
count ++;
}
}
或者
for(count = 0;n != 0;n &= n-1)
{
count ++;
}

将二进制的倒数第M位的前N位取反

异或1相当于取反(0^1 = 1)
( 1^1 = 0)
假设二进制数为10010011;M=2,N=4,那么取反第3到6位,异或的数应该是00111100,将它变回1,首先需要右移M位,成为00001111;再加一,得到00010000,再右移N位得到00000001.
因此,从1到需要的数有三步:
1.将1左移N位;
2.减一;
3.左移M位;
最后再将得到的数与二进制数异或
void fan(int num,int m,int n)
{
int tem = 1<<n;
tem = tem - 1;
tem = tem << m;
num = num^tem;
printf("%d\n",num);
}

找到数组中的唯一一个元素

数组中元素都是两两相等,现在加入一个与数组中所有元素都不同的数,找到这个数
异或,两个相同的数异或为0;
num = 0;
for(i=0;i<n;i++)
{
num ^= a[i];
}

指针常量和常量指针

指针常量是指针类型的常量,(始终指向一个地址)不能改变指针的值;
int a = 10;
int *const p = &a;
*p = 30;(可以改变指向的内容)
p = &b (不可以改变指向的地址)

常量指针是指向常量 的指针,不可以改变指针指向的内容
int a = 10;
const int *p = &a;
*p = 60;(不可以改变指向的内容)
p = &b(可以改变指向的地址)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值