C++八股

1 在main执行之前和之后执行的代码可能是什么?
2 结构体内存对齐问题
3 指针和引用的区别
  • 指针是一个变量,存储地址;引用跟原来的变量实质上是同一个东西,是原变量的别名
  • 指针可以有多级,引用只有一级
  • 指针可以为空,引用不能为NULL,且在定义时必须初始化
  • 指针可以改变指向,而引用在初始化之后不可再改变
  • sizeof指针得到的是本指针的大小,sizeof引用得到的是引用所指向变量的大小
  • 当把指针作为参数进行传递时,是拷贝传参,和引用传参不同。拷贝的是指针,形参和实参指向的地址相同,但不是同一个变量
  • 在汇编层面,一些编译器将引用当成指针操作,因此引用会占用空间。是否占用空间,应该结合编译器分析。
4 在传递函数参数时,什么时候该使用指针,什么时候该使用引用?
  • 对栈空间大小比较敏感(比如递归)的时候使用引用。使用引用传递不需要创建临时变量,开销要更小

  • 类对象作为参数传递的时候使用引用,这是C++类对象传递的标准方式

  • 需要返回函数内局部变量的内存的时候用指针,而返回局部变量的引用是没有意义的

5 区分指针
int *p[10]        强调数组,p是指针数组。p是int*类型的数组
int (*p)[10]      强调指针,p是数组指针。p指向int类型的数组。总不可能是int*类型的数组吧!
int *p(int)       函数声明
int (*p)(int)     函数指针

假设数组int a[10]; int (*p)[10] = &a;其中:

  • a是数组名,是数组首元素地址,+1表示地址值加上一个int类型的大小,如果a的值是0x00000001,加1操作后变为0x00000005。*(a + 1) = a[1]。
  • &a是数组的指针,其类型为int (*)[10](就是前面提到的数组指针),+1时,系统会认为是数组首地址加上整个数组的偏移(10个int型变量)。
  • 若(int *)p ,此时输出 *p时,其值为a[0]的值,因为被转为int *类型,解引用时按照int类型大小来读取===========???======================
6 宏定义和函数区别
#define MAX(a, b) ((a) > (b) ? (a) : (b))
  • 宏定义在预处理阶段完成替换,之后被替换的文本参与编译,相当于直接插入了代码,运行时不存在函数调用,执行起来更快;函数调用在运行时需要跳转到具体调用函数。
  • 宏定义参数没有类型不进行类型检查;函数参数具有类型,需要检查类型。
7 宏定义和typedef区别
  • 宏主要用于定义常量及书写复杂的内容;typedef主要用于定义类型别名

  • 宏替换发生在编译阶段之前,属于文本插入替换;typedef是编译的一部分

  • 不进行类型检查;typedef会检查数据类型

  • 类型别名可以声明变量或作为返回类型,宏定义不可以

typedef char * p: p是char *的别名,别名可用于声明变量 (p c) ,或作为函数返回值;

#define p char *: 仅仅是在预处理时将char* 替换成p,不可用于声明变量

8 变量声明和定义区别
  • 声明仅仅是把变量的声明的位置及类型提供给编译器,并不(显示)分配内存空间;定义要在定义的地方为其分配存储空间。

  • 相同变量可以在多处声明(外部变量extern),但只能在一处定义

如,int x;

这是声明。如果x是全局或静态变量,会被默认初始化为x=0,会分配内存空间。

但是,  int x; 并没有显示分配内存空间,仍是声明

9 堆和栈区别,谁快? 
10 new delete malloc free
11 sizeof strlen
12 一个指针几个字节
13 常量指针和指针常量
14 c++和c/java/python区别

15

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值