三尺非寒 发表于 2025-4-4 13:39:16

面试题目--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]
查看完整版本: 面试题目--C语言