基础语法(一)

目录

1.在main执行前后执行的代码可能是什么?

 2.结构体内存对齐问题?

3.指针和引用区别

4.传递参数时,什么时候使用指针,什么时候使用引用?

5.堆和栈的区别

6.堆快还是栈快?

7.区别指针类型?

8.new/delete和malloc/free的异同

9.new和delete如何实现?

10.malloc和new的区别?

11.既然有了malloc/free,C++中为什么还需要new/delete呢?直接用 malloc/free不好吗?

12.被free回收的内存是立即返还给操作系统吗?

13.宏定义和函数有何区别?

14.宏定义和typedef区别?

15.变量声明和定义区别?

16.strlen和sizeof区别?

17.常量指针和指针常量的区别?

18.a和&a有什么区别?

19.C++和Python的区别

20.C++和C语言的区别


1.在main执行前后执行的代码可能是什么?

main执行之前

  • 设置栈指针
  • 初始化静态stastic变量和globe全局变量
  • 将未初始化部分的全局变赋初值
  • 全局对象初始化,如在main前调用的构造函数
  • 参数传参

main执行之后

  • 全局对象的析构函数
  • atexit注册的一个函数

atexit函数(登记函数和终止处理函数)

参考:http://t.csdnimg.cn/3LXOU

 2.结构体内存对齐问题?

  • 结构体内成员按照声明顺序存储,第一个成员地址和整个结构体地址相同
  • 未特殊说明,按结构体中size最大成员对齐

3.指针和引用区别

  • 指针是变量,存储地址;引用跟原变量实质是一个东西,是变量别名
  • 指针可以有多级;引用只有一级
  • 指针可以为空,存在指向空值的指针;引用不能为NULL且需初始化,不存在指向空值的引用
  • 指针指向可以改变;引用不可以
  • sizeof指针的到指针的大小;sizeof引用得到变量的大小
  • 指针作为参数传递时,是将实参的一个拷贝传递给形参,指向地址相同,但不是同一个变量,在函数中改变变量指向不影响实参;引用影响
  • 指针声明和定义可以分开,可以只声明指针变量用到时再指向具体变量;引用声明时必须初始化为另一变量

4.传递参数时,什么时候使用指针,什么时候使用引用?

  • 返回函数内局部变量的内存用指针。使用指针传参需要开辟内存,用完释放指针,不然会内存泄漏
  • 对栈空间大小敏感(如递归)的时候使用引用。不需要创建临时变量,开销更小
  • 类对象作为参数传递的时候使用引用,这是C++类对象床底的标准方式

内存泄漏

向系统申请分配内存进行使用 (new),可是使用完了以后却不归还 (delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序

5.堆和栈的区别

栈(stack)又名堆栈是操作系统在建立某个进程时或者线程,为这个线程建立的存储区域,在编译的时候可以指定需要的栈的大小,线性表先进后出

堆(heap)是一种数据结构,堆控制一段自己的存储空间,叫做堆空间,不连续存储空间,自己创建

申请方式不同

  • 栈由系统自动分配
  • 堆由自己申请和释放

申请大小限制不同

  • 栈顶和栈底是预设好的,栈向低地址(栈底)扩展,连续的内存区域,大小固定,通过ulimit-a查看、ulimit-s修改
  • 堆向高地址扩展,不连续的内存区域(因为系统用链表存储空闲内存地址),大小可以灵活调整

申请效率不同

  • 栈由系统分配,速度快,不会有碎片
  • 堆由程序员分配,速度慢,会有碎片,易产生内存泄漏

6.堆快还是栈快?

栈快

栈由操作系统底层提供支持,分配专门寄存器存放栈地址,入栈出栈简单且有专门指令

堆操作由C/C++函数库提供支持,分配内存需要算法寻找合适内存大小,且需要两次访问获取堆内容(访问指针、根据指针地址访问内存)

7.区别指针类型?

int *p[10]
int (*p)[10]
int *p(int)
int (*p)(int)
  • int *p[10]表示指针数组,强调数组概念,是一个数组变量,数组大小为10,数组内每个元素都是指向 int类型的指针变量
  • int (*p)[10]表示数组指针,强调是指针,只有一个变量,是指针类型,不过指向的是一个int类型的数 组,这个数组大小是10
  • int *p(int)是函数声明,函数名是p,参数是int类型的,返回值是int *类型的
  • int (*p)(int)是函数指针,强调是指针,该指针指向的函数具有int类型参数,并且返回值是int类型的

8.new/delete和malloc/free的异同

相同点

  • 都可以用于内存的动态申请和释放

不同点

  • 前者是C++运算符,后者是C/C++语言标准库函数,需要库文件支持
  • new自动计算分配空间大小,malloc手动计算
  • new类型安全,malloc不是
  • new是封装了malloc,直接free不会报错,但是这只是释放内存,而不会析构对象
  • new调用名为operator new的标准库函数分配足够空间并调用相关对象的构造函数,delete对指针所指 对象运行适当的析构函数;然后通过调用名为operator delete的标准库函数释放该对象所用内存。后者均没有相关调用

9.new和delete如何实现?

  • new的实现过程是:首先调用名为operator new的标准库函数,分配足够大的原始为类型化的内存, 以保存指定类型的一个对象;接下来运行该类型的一个构造函数,用指定初始化构造对象;最后返回 指向新分配并构造后的的对象的指针
  • delete的实现过程:对指针指向的对象运行适当的析构函数;然后通过调用名为operator delete的标准 库函数释放该对象所用内存

10.malloc和new的区别?

  • malloc和free返回的是void类型指针(必须进行类型转换),new和delete返回的是具体类型指针
  • malloc和free是标准库函数,支持覆盖;new和delete是运算符,不重载
  • malloc仅仅分配内存空间,free仅仅回收空间,不具备调用构造函数和析构函数功能,用malloc分配空 间存储类的对象存在风险;new和delete除了分配回收功能外,还会调用构造函数和析构函数

11.既然有了malloc/free,C++中为什么还需要new/delete呢?直接用 malloc/free不好吗?

  • malloc/free和new/delete都是用来申请内存和回收内存的
  • 在对非基本数据类型的对象使用的时候,对象创建的时候还需要执行构造函数,销毁的时候要执行析 构函数。而malloc/free是库函数,是已经编译的代码,所以不能把构造函数和析构函数的功能强加给 malloc/free,所以new/delete是必不可少的

12.被free回收的内存是立即返还给操作系统吗?

不是的,被free回收的内存会首先被ptmalloc使用双链表保存起来,当用户下一次申请内存的时候,会尝 试从这些内存中寻找合适的返回,避免了频繁的系统调用

13.宏定义和函数有何区别?

  • 宏在编译时完成替换,之后被替换的文本参与编译,相当于直接插入了代码,运行时不存在函数调用,执行起来更快;函数调用在运行时需要跳转到具体调用函数
  • 宏定义属于在结构中插入代码,没有返回值;函数调用具有返回值
  • 宏定义参数没有类型,不进行类型检查;函数参数具有类型,需要检查类型
  • 宏定义不要在最后加分号

宏定义http://t.csdnimg.cn/xD3IK

14.宏定义和typedef区别?

  • 宏主要用于定义常量及书写复杂的内容;typedef主要用于定义类型别名
  • 宏替换发生在编译阶段之前,属于文本插入替换;typedef是编译的一部分
  • 宏不检查类型;typedef会检查数据类型
  • 宏不是语句,不在在最后加分号;typedef是语句,要加分号标识结束

15.变量声明和定义区别?

  • 声明把变量的声明的位置类型提供给编译器,不分配内存空间定义要在定义的地方分配存储空间
  • 相同变量可以多处声明,但只能在一处定义

16.strlen和sizeof区别?

  • sizeof是运算符,并不是函数,结果在编译时得到而非运行中获得;strlen是字符处理的库函数
  • sizeof参数可以是任何数据的类型或者数据;strlen的参数只能是字符指针且结尾 是'\0'的字符串
  • sizeof值在编译时确定,所以不能用来得到动态分配(运行时分配)存储空间的大小

17.常量指针和指针常量的区别?

  • 指针常量是一个指针,读成常量的指针,指向一个只读变量(作int const *p、const int *p)
  • 常量指针是一个不能给改变指向的指针(int *const p)

18.a和&a有什么区别?

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

  • a是数组名,是数组首元素地址
  • &a是数组的指针

19.C++和Python的区别

  • Python是一种脚本语言,是解释执行的;C++是编译语言,是需要编译后在特定平台运行的
  • Python使用缩进来区分不同的代码块,C++使用花括号来区分
  • C++中需要事先定义变量的类型,而Python不需要,Python的基本数据类型只有数字,布尔值,字符 串,列表,元组等等
  • python可以很方便的跨平台,但是效率没有C++高
  • Python的库函数比C++的多,调用起来很方便

20.C++和C语言的区别

  • C++中new和delete是对内存分配的运算符,取代了C中的malloc和free
  • 标准C++中的字符串类取代了标准C函数库头文件中的字符数组处理函数(C中没有字符串类型)
  • C++中用来做控制态输入输出的iostream类库替代了标准C中的stdio函数库
  • C++中的try/catch/throw异常处理机制取代了标准C中的setjmp()和longjmp()函数
  • C++可以重载(不同参数类型可以有相同函数名),C语言不允许
  • C++语言中,允许变量定义语句在程序中的任何地方,只要在是使用它之前就可以;而C语言中,必 须要在函数开头部分
  • 在C++中,除了值和指针之外,新增了引用
  • C++相对与C增加了一些关键字,如:bool、using、dynamic_cast、namespace等等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值