面试题目--C语言
C语言题目解答此文章为C++面试宝典C语言部分题目的解答条记。
1、const的作用有哪些?谈一谈你对const的理解?
[*]核心作用:
[*]定义不可修改的常量:如 const int MAX = 100;。
[*]增强范例安全:编译器会查抄const变量的非法修改操作。
[*]掩护函数参数或返回值:例如 void func(const int* p) 防止指针指向内容被修改。
[*]优化可能性:编译器可将const变量放入符号表,减少内存访问。
2、描述char*、const char*、char* const、const char* const的区别?
范例指针可变性内容可变性示例char*✔️✔️p++正当,*p='a'正当const char*✔️❌p++正当,*p='a'非法char* const❌✔️p++非法,*p='a'正当const char* const❌❌均不可变 记忆口诀
[*]const在*左侧:指向内容不可变(如const char*)
[*]const在*右侧:指针本身不可变(如char* const)
3、指针常量和常量指针有什么区别?
[*]常量指针(const int* p):指向内容不可变,但指针可重定向。
[*]指针常量(int* const p):指针地址固定,但内容可修改。
4、static的作用是什么?什么环境下用到static?
[*]作用:
[*]隐藏作用域:全局变量/函数仅在当前文件可见。
[*]延永生命周期:局部变量在程序运行期间存在(如计数器))。
[*]类/结构体中的静态成员:属于类本身而非实例,全部对象共享(C++中)
[*]使用场景:
[*]必要恒久化局部变量(如计数器)。
[*]限定全局变量/函数的可见性(制止定名冲突)。
5、全局变量与局部变量的区别?
特性全局变量局部变量作用域整个程序函数/块内存储位置静态存储区栈生命周期程序运行期间函数调用期间默认值自动初始化为0未初始化时为随机值 6、宏定义的作用是什么?
[*]作用:
[*]代码复用:简化重复代码(如#define MAX(a, b)。
[*]条件编译:根据条件选择性编译代码块(如#ifdef DEBUG。
[*]常量定义:替换字面量,提高可读性。
7、内存对齐的概念?为什么会有内存对齐?
[*]概念:数据地址需满意对齐规则(如4字节范例地址需为4的倍数)。
[*]缘故原由:
[*]硬件要求:某些CPU只能访问对齐地址。
[*]性能优化:对齐后内存访问减少次数。
8、inline内联函数的特点有哪些?优缺点是什么?
[*]特点:
[*]编译时展开:制止函数调用开销。
[*]短小干练:适合频繁调用的小函数。
[*]优点:提高执行效率。
[*]缺点:代码膨胀(多次展开可能导致文件变大)。
9、如何用C实现C++的面向对象特性(封装、继续、多态)?
[*] 封装:
使用结构体隐藏数据,通过函数指针操作成员
typedef struct {
int data;
void (*print)(void* self);
} Object;
[*] 继续:
结构体嵌套实现派生类(基类作为第一个成员)
typedef struct {
Object base;
int derived_data;
} Derived;
[*] 多态:
函数指针动态绑定差别实现(如虚函数表)
10、memcpy怎么实现让它效率更高?
[*]优化计谋:
[*]内存对齐:按机器字长(如4/8字节)拷贝,减少非对齐访问
[*]SIMD指令:使用SSE/AVX指令集并行拷贝大块数据
[*]减少分支:制止循环中的条件判断(如固定步长拷贝)
[*]预取数据:提前加载数据到CPU缓存
11、typedef和define有什么区别?
特性typedefdefine处置惩罚阶段编译时预处置惩罚时范例安全✔️(范例查抄)❌(文本替换)作用域块作用域文件作用域复杂声明支持(如函数指针)需额外括号3335
[*]示例:typedef int* IntPtr;// 定义类型别名
#define PTR int* // 文本替换(可能引发错误)
12、extern有什么作用?extern C有什么作用?
[*] extern:
声明变量或函数在外部定义(用于跨文件访问全局变量)
extern int global_var; // 声明而非定义
[*] extern “C”:
在C++中指示编译器按C语言方式编译函数(制止名称修饰,方便C/C++混淆编程)
13、如何制止野指针?
[*]方法:
[*]初始化置NULL:int *p = NULL;
[*]开释后置空:free(p); p = NULL;
[*]制止返回局部变量地址:局部变量栈空间可能被覆盖
[*]使用智能指针(C++):自动管理生命周期
14、如何盘算结构体长度?
[*]对齐规则:
[*]成员按自身巨细与编译器对齐基数较小者对齐;
[*]结构体总巨细为最大成员对齐值的整数倍
[*]示例:struct Example {
char a; // 1字节(对齐到1)
int b; // 4字节(对齐到4,前补3字节)
}; // 总大小 = 1 + 3(填充) + 4 = 8字节
15、sizeof和strlen有什么区别?
特性sizeofstrlen范例运算符函数作用盘算内存巨细(含’\0’)盘算字符串长度(不含’\0’)参数范例或变量字符串指针4547
[*]示例:char str[] = "hello";
sizeof(str);// 6(包含'\0')
strlen(str);// 5
16、知道条件变量吗?条件变量为什么要和锁配合使用?
[*]条件变量:
用于线程间同步,允许线程等候特定条件成立(如资源就绪)
[*]与锁配合的缘故原由:
[*]原子性:查抄条件和进入等候需在锁掩护下,制止竞态条件
[*]制止唤醒丢失:开释锁后,其他线程可修改条件并发出信号
[*]典型用法:pthread_mutex_lock(&mutex);
while (condition_not_met) {
pthread_cond_wait(&cond, &mutex);
}
// 操作共享资源
pthread_mutex_unlock(&mutex);
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]