C语言提问
常见问题
-
C与C++ 的区别
- C是面向过程,C++是面向对象的
- 面向过程编程:分析解决问题的步骤,并按步骤实现,人直接调用函数。性能好。
- 面向对象编程:把问题分解成各个对象,为了描述某个事物在整个解决问题的步骤中的行为。易维护、易复用及易拓展,有封装、继承及多态特性。类的调用需实例化,开销大。
- C是面向过程,C++是面向对象的
-
C语言程序的三种基本结构:顺序,选择,循环
-
gcc编译过程:Linux编译器,过程包括:
- 预处理:头文件包含、宏替换、条件编译、删除注释
- 编译: 进行词法、语法、语义分析,编译成汇编文件(.obj文件)
- 汇编:将汇编文件转化为二进制文件 (.o文件)
- 链接:将各个二进制文件+所需的库+启动代码链接成可执行文件(.exe)
-
传值、传址、引用的区别:
- 是否为形参分配地址(传值、传址会)
- 形参值的改变是否影响实参的值(传值、传址会)
- 传址与引用:注意对贴标签的理解;引用<别名,对形参和实参名字的操作影响一致>,传址<调用指针,改变指针值时影响不同>
-
局部变量使用 ** static **定义的作用
- 函数调用结束后,保留原值(储存单元不释放):从栈中存放改为静态存储区存放
- 注意作用域:
-
struct和class的区别:
- C:struct只能定义成员变量,不能定义成员函数
- C++:struct可以有构造函数与成员函数,且有class的其他特性
- C++中struct默认成员为public,class中成员为private
-
break和continue的区别:
- continue只结束本次循环,而不是终止整个循环
- continue只能在循环语句中使用,即switch不可使用
-
&& 和 &,|| 和 | 的区别
- 逻辑运算和求值运算
-
typedef 和 #define的区别:
- 类型定义关键字和预处理指令:编译阶段和预处理阶段(是否涉及类型检测)
- typedef为已有数据类型取别名
- 宏定义是字符替换,没有数据类型的区别,不分配内存,不会进行类型检查,可能产生边际效益等错误
-
指针和数组的区别
- 指针保存数据的地址,数组保存数据,数组名代表数组首元素的地址
- 指针间接访问数据,数组直接访问数据
- 指针通常动态数据结构,数组通常用于存储固定数据个数且数据元素相同
-
运算符优先级关系:
- !> 算术运算符 > 关系运算符 > && > || > 赋值运算符
-
内存分配和内存释放:
- 静态存储类型:系统自动分配、释放
- 动态存储类型:在程序实际运行过程中,按需求分配,系统不会自动释放(free函数)
-
内存分布:
- 栈区:编译器自动分配释放,存放函数的局部变量
- 堆区:程序员分配和释放,动态分配(分配方式类似链表,不是DS的堆)
- 全局静态区:存放全局变量和常量
- 文字常量区:存放常量字符串
- 代码区:存放函数体的二进制代码
-
*p++ 和(*p)++ 区别:
- *p++ :取当前值,再移动地址
- (*p)++ 区别:取当前值,数值加1
-
#include<file.h> 和 #include "file.h" 思维区别:
- 首先从编译器默认的include目录寻找头文件/在源码当前目录下寻找头文件
-
局部变量和全局变量重名:
- 使用全局变量会使用“::”
- 作用域,局部屏蔽全局
-
内联函数:
- 修饰符inline
- 直接复制内联函数代码到主函数代码中,不跳转到内联函数的入口地址(不同于函数调用),顺序执行,可能被复制数份放在对应位置
-
变量命名规则:有字母、数字及下划线组成,不能以数字开头
-
函数定义和函数声明的区别:
- 声明不包括函数体
- 对函数功能的确立:指定函数名、函数类型、形参及其类型、函数体等
-
野指针:未初始化的指针,指向一个随意的地址。
- 指针变量声明时未被初始化:可以是具体地址值,或NULL
- 指针p被free或delete之后,没有设置为NULL
- 指针操作超越了变量的作用范围:在变量的作用域结束前释放掉变量的地址空间并让指针指向NULL
-
库函数:写好的、成熟的、可复用的代码。底层库
-
结构体内存对齐:
- 数据成员对齐,第一个成员放在offset为0的地方,以后每个成员存储的起始位置要从自身成员大小的整数倍开始
- 结构体作为成员:嵌套,从结构体内部最大元素大小的整数倍地址开始
- 结构体的总大小必须是内部最大成员的整数倍
-
const char*p , char * const p 的区别
常量指针:const位于的左边,const就是用来修饰指针所指向的变量,即指针指向为常量,指针所指对象的值 p 不能更改,但指针p可以修改;
指针常量:const位于的右边,const 修饰指针本身,即指针本身是常量。p表示一个指针地址,指针变量不能被修改,但指针所指向的值p可以被修改。