1. 基础概念题
问题:C语言中变量声明
和变量定义
的区别是什么?
答案:
- 声明(Declaration):告知编译器变量的类型和名称,但不分配内存(如
extern int a;
)。 - 定义(Definition):分配内存并初始化变量(如
int a = 10;
)。 - 变量可以多次声明,但只能定义一次。
2. 指针与数组
问题:指针和数组名的区别是什么?举例说明。
答案:
- 数组名是常量指针,指向数组首元素地址(如
arr
等价于&arr[0]
),不可修改;指针是变量,可以指向不同地址。int arr[5] = {1,2,3}; int *p = arr; p++; // 合法,指向arr[1] arr++; // 非法,数组名是常量
3. 内存管理
问题:malloc
和free
的作用是什么?如何避免内存泄漏?
答案:
malloc
动态分配堆内存(如int *p = (int*)malloc(10*sizeof(int))
),free
释放内存(free(p)
)。- 避免内存泄漏:
- 确保每次
malloc
后都有对应的free
。 - 指针释放后置为
NULL
(p = NULL
)。 - 避免重复释放或访问已释放的内存。
- 确保每次
4. 文件操作
问题:C语言中fopen
的打开模式"r"
和"rb"
有何区别?
答案:
"r"
:以文本模式打开文件(读取时会进行换行符转换,如Windows下\r\n
转\n
)。"rb"
:以二进制模式打开文件(直接读取原始字节,无转换)。- 跨平台文件操作建议使用二进制模式避免兼容性问题。
5. 函数与递归
问题:递归函数的优缺点是什么?举例说明。
答案:
- 优点:代码简洁,适合解决分治类问题(如阶乘、斐波那契数列)。
- 缺点:
- 递归深度过大可能导致栈溢出。
- 重复计算可能降低效率(如斐波那契递归未优化时时间复杂度为O(2^n))。
int factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n-1); // 递归调用
}
6. 结构体与共用体
问题:结构体(struct)和共用体(union)的内存布局有何不同?
答案:
- 结构体:成员占用独立内存空间,总大小为所有成员大小之和(考虑对齐)。
- 共用体:所有成员共享同一块内存,大小为最大成员的大小。
7. 函数指针应用
问题:函数指针有什么实际用途?举例说明。
答案:
- 用途:实现回调函数、动态绑定(如排序算法中传递比较函数)。
8. 预处理指令
问题:#include <stdio.h>
和#include "myheader.h"
的区别是什么?如何避免头文件重复包含?
答案:
- **
< >
**:搜索系统目录(如/usr/include
)。 - **
" "
**:先搜索当前目录,再搜索系统目录。#ifndef MYHEADER_H #define MYHEADER_H // 头文件内容 #endif
9. 算法实现题
问题:写一个函数实现字符串反转(原地修改,不额外分配内存)。
答案:
void reverse_str(char *str) {
if (str == NULL) return;
int len = strlen(str);
for (int i = 0; i < len/2; i++) {
char temp = str[i];
str[i] = str[len-1-i];
str[len-1-i] = temp;
}
}
10. 高级概念
问题:const
关键字在C语言中的作用有哪些?
答案:
- 修饰变量:
const int a=5;
变量不可修改。 - 修饰指针:
const int *p
:指针指向的值不可变。int *const p
:指针本身不可变。
- 修饰函数参数:避免函数内意外修改数据(如
void func(const char *str)
)
祝各位考研上岸记得点关注哦!!!