C语言作为计算机编程语言的基础,掌握C语言的经典面试题不仅能帮助求职者巩固知识,还能在面试中脱颖而出。本文将系统整理30道C语言经典面试题,涵盖基础语法、指针运用、内存管理、数据结构等核心知识点,并给出详细答案解析,助你轻松应对C语言面试。
答案:
C语言的基本数据类型主要包括:
- `int`:整型,通常占4字节,用于存储整数。
- `char`:字符型,1字节,存储单个字符。
- `float`:单精度浮点型,通常4字节。
- `double`:双精度浮点型,通常8字节。
- `void`:无类型,通常用于函数返回类型表示无返回值或指针类型。
答案:
指针是存储变量地址的变量。声明指针时,需要指定指针所指向的数据类型,如`int *p;`表示指向整型的指针。使用指针时,可以通过`*p`访问指针指向的变量。示例:
int a = 10;
int *p = &a; // p指向a的地址
printf("%d
", *p); // 输出10
答案:
数组名在表达式中通常表示数组首元素的地址,因此数组名相当于指针常量。指针可以用于遍历数组。区别是数组名不可修改,而指针变量可以改变指向。示例:
int arr[3] = {1,2,3};
int *p = arr; // p指向数组首元素
printf("%d
", *(p+1)); // 输出2
答案:
指针的指针是指向指针变量的指针,声明方式如`int pp;`。它可以间接访问多级指向的数据。示例:
int a = 5;
int *p = &a;
int pp = &p;
printf("%d
", pp); // 输出5
答案:
C语言中动态分配内存主要用`malloc`、`calloc`和`realloc`函数。
- `malloc(size_t size)`:分配指定字节大小的内存,内容未初始化。
- `calloc(size_t n, size_t size)`:分配n个元素,每个元素size字节的内存,内容初始化为0。
- `realloc(void *ptr, size_t size)`:重新分配内存大小,ptr为原指针。
分配后必须用`free`释放内存。
答案:
- 悬空指针:指向已经释放或无效内存的指针。
- 野指针:未初始化的指针。
避免方法:指针初始化为NULL,释放后将指针设置为NULL,避免使用未初始化指针。
答案:
- 结构体(`struct`)是将多个不同类型变量组合成一个整体,所有成员占用不同内存空间,总大小是所有成员大小之和。
- 联合体(`union`)所有成员共用同一块内存,大小是最大成员大小。
结构体用于保存多变量,联合体用于节省内存。
答案:
`const`用于修饰变量,表示该变量值不可修改。可以修饰基本类型、指针等。示例:
const int x = 10;
// x = 20; // 错误,不能修改
答案:
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
答案:
递归函数是指在函数内部调用自身的函数。适合解决分治问题。示例:计算阶乘
int factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n-1);
}
答案:
使用按位与运算符`&`判断最低位是否为1。
if (num & 1)
printf("奇数
");
else
printf("偶数
");
答案:
- 数组是同类型元素的集合,可以是任意类型。
- 字符串是以``结尾的字符数组,表示文本。字符串是字符数组的特例。
答案:
char *str = "hello";
while (*str!=" ") {
printf("%c ", *str);
str++;
}
答案:
- 在函数内,`static`变量生命周期扩展为整个程序运行期间,且只初始化一次。
- 在文件内,`static`限制变量或函数的作用域仅限于当前文件。
答案:
内存泄漏指程序动态分配的内存未释放,导致系统内存被占用。避免方法是配对使用`malloc`和`free`,确保每次分配的内存都被释放。
答案:
指针运算包括指针加减整数,指针相减,指针比较等。加减整数时,指针会根据所指数据类型自动调整偏移量。
答案:
int isPalindrome(char *str) {
int len = strlen(str);
int i = 0, j = len - 1;
while (i < j) {
if (str[i] != str[j]) return 0;
i++; j--;
}
return 1;
}
答案:
`typedef`用于给已有类型定义新的名字,方便代码书写和理解。示例:
typedef unsigned int uint;
uint a = 10;
答案:
示例代码:
typedef struct Node {
int data;
struct Node *next;
} Node;
void insertAtHead(Node head, int val) {
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = val;
newNode->next = *head;
*head = newNode;
}
答案:
函数指针指向函数地址,可以调用函数。定义示例:
int add(int a, int b) { return a + b; }
int (*funcPtr)(int, int) = add;
int result = funcPtr(2, 3);
答案:
宏定义用`#define`定义常量或代码片段,预处理时替换。优点是效率高,无函数调用开销;缺点无类型检查,可能导致调试困难。
答案:
使用`strcmp`函数,返回0表示相等。
if (strcmp(str1, str2) == 0)
printf("相等
");
答案:
double average(int arr[], int n) {
int sum = 0;
for (int i=0; i<n; i++) {
sum += arr[i];
}
return (double)sum / n;
}
答案:
`volatile`告诉编译器该变量可能被意外修改,禁止优化访问,常用于硬件寄存器或多线程环境。
答案:
void myStrcpy(char *dest, const char *src) {
while((*dest++ = *src++));
}
答案:
位运算是对二进制位进行操作的运算,包括:
- 按位与`&`
- 按位或`|`
- 按位异或`^`
- 取反`~`
- 左移`<<`
- 右移`>>`
答案:
2的幂的数二进制中只有一个1,因此:
int isPowerOfTwo(unsigned int n) {
return n && !(n & (n - 1));
}
答案:
内联函数使用`inline`关键字,建议编译器将函数代码直接插入调用处,减少函数调用开销,提高效率。
答案:
void reverse(char *str) {
int i = 0, j = strlen(str)-1;
while (i < j) {
char temp = str[i];
str[i] = str[j];
str[j] = temp;
i++; j--;
}
}
答案:
`extern`用于声明外部变量或函数,表示该变量或函数在其他文件定义,用于跨文件访问。
总结
本文整理了30道C语言经典面试题,涵盖了基础语法、指针、内存管理、字符串操作、数据结构和关键字等重要知识点。掌握这些题目不仅能够帮助理解C语言核心机制,还能在面试中展现扎实的编程功底。建议读者结合实际编程练习,加深对每个知识点的理解和应用,提升面试成功率。祝你面试顺利!
未经 qmjianli.com 同意,不得转载或采集本站的文章。