C语言经典面试题(30道)



C语言作为计算机编程语言的基础,掌握C语言的经典面试题不仅能帮助求职者巩固知识,还能在面试中脱颖而出。本文将系统整理30道C语言经典面试题,涵盖基础语法、指针运用、内存管理、数据结构等核心知识点,并给出详细答案解析,助你轻松应对C语言面试。


1. C语言的基本数据类型有哪些?

答案:

C语言的基本数据类型主要包括:

- `int`:整型,通常占4字节,用于存储整数。

- `char`:字符型,1字节,存储单个字符。

- `float`:单精度浮点型,通常4字节。

- `double`:双精度浮点型,通常8字节。

- `void`:无类型,通常用于函数返回类型表示无返回值或指针类型。

2. 指针是什么?如何声明和使用指针?

答案:

指针是存储变量地址的变量。声明指针时,需要指定指针所指向的数据类型,如`int *p;`表示指向整型的指针。使用指针时,可以通过`*p`访问指针指向的变量。示例:

int a = 10;

int *p = &a; // p指向a的地址

printf("%d

", *p); // 输出10

3. C语言中数组和指针有什么关系?

答案:

数组名在表达式中通常表示数组首元素的地址,因此数组名相当于指针常量。指针可以用于遍历数组。区别是数组名不可修改,而指针变量可以改变指向。示例:

int arr[3] = {1,2,3};

int *p = arr; // p指向数组首元素

printf("%d

", *(p+1)); // 输出2

4. 什么是“指针的指针”?如何使用?

答案:

指针的指针是指向指针变量的指针,声明方式如`int pp;`。它可以间接访问多级指向的数据。示例:

int a = 5;

int *p = &a;

int pp = &p;

printf("%d

", pp); // 输出5

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`释放内存。

6. 解释什么是“悬空指针”和“野指针”,如何避免?

答案:

- 悬空指针:指向已经释放或无效内存的指针。

- 野指针:未初始化的指针。

避免方法:指针初始化为NULL,释放后将指针设置为NULL,避免使用未初始化指针。

7. C语言中结构体和联合体的区别?

答案:

- 结构体(`struct`)是将多个不同类型变量组合成一个整体,所有成员占用不同内存空间,总大小是所有成员大小之和。

- 联合体(`union`)所有成员共用同一块内存,大小是最大成员大小。

结构体用于保存多变量,联合体用于节省内存。

8. 解释C语言中的“const”关键字作用?

答案:

`const`用于修饰变量,表示该变量值不可修改。可以修饰基本类型、指针等。示例:

const int x = 10;

// x = 20; // 错误,不能修改

9. 写出交换两个整数值的函数,要求使用指针参数。

答案:

void swap(int *a, int *b) {

int temp = *a;

*a = *b;

*b = temp;

}

10. 解释什么是递归函数,并举例。

答案:

递归函数是指在函数内部调用自身的函数。适合解决分治问题。示例:计算阶乘

int factorial(int n) {

if (n <= 1) return 1;

return n * factorial(n-1);

}

11. C语言中如何判断一个数是奇数还是偶数?

答案:

使用按位与运算符`&`判断最低位是否为1。

if (num & 1)

printf("奇数

");

else

printf("偶数

");


12. 解释数组和字符串的区别。

答案:

- 数组是同类型元素的集合,可以是任意类型。

- 字符串是以``结尾的字符数组,表示文本。字符串是字符数组的特例。


13. 如何使用指针遍历字符串?

答案:

char *str = "hello";

while (*str!="") {

printf("%c ", *str);

str++;

}


14. 解释C语言中的“static”关键字作用。

答案:

- 在函数内,`static`变量生命周期扩展为整个程序运行期间,且只初始化一次。

- 在文件内,`static`限制变量或函数的作用域仅限于当前文件。


15. 解释什么是内存泄漏?如何避免?

答案:

内存泄漏指程序动态分配的内存未释放,导致系统内存被占用。避免方法是配对使用`malloc`和`free`,确保每次分配的内存都被释放。


16. 解释C语言中的“指针运算”。

答案:

指针运算包括指针加减整数,指针相减,指针比较等。加减整数时,指针会根据所指数据类型自动调整偏移量。


17. 写出判断一个字符串是否是回文的函数。

答案:

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;

}


18. 解释C语言中的“typedef”关键字。

答案:

`typedef`用于给已有类型定义新的名字,方便代码书写和理解。示例:

typedef unsigned int uint;

uint a = 10;



19. 如何实现链表的插入操作?

答案:

示例代码:

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;

}


20. 什么是函数指针?如何定义和使用?

答案:

函数指针指向函数地址,可以调用函数。定义示例:

int add(int a, int b) { return a + b; }

int (*funcPtr)(int, int) = add;

int result = funcPtr(2, 3);


21. 解释什么是“宏定义”,有什么优缺点?

答案:

宏定义用`#define`定义常量或代码片段,预处理时替换。优点是效率高,无函数调用开销;缺点无类型检查,可能导致调试困难。


22. C语言中如何判断两个字符串是否相等?

答案:

使用`strcmp`函数,返回0表示相等。

if (strcmp(str1, str2) == 0)

printf("相等

");


23. 写出一个函数,计算数组元素的平均值。

答案:

double average(int arr[], int n) {

int sum = 0;

for (int i=0; i<n; i++) {

sum += arr[i];

}

return (double)sum / n;

}


24. 解释C语言中的“volatile”关键字。

答案:

`volatile`告诉编译器该变量可能被意外修改,禁止优化访问,常用于硬件寄存器或多线程环境。


25. 如何实现字符串复制函数?

答案:

void myStrcpy(char *dest, const char *src) {

while((*dest++ = *src++));

}


26. 解释什么是位运算,常用操作有哪些?

答案:

位运算是对二进制位进行操作的运算,包括:

- 按位与`&`

- 按位或`|`

- 按位异或`^`

- 取反`~`

- 左移`<<`

- 右移`>>`


27. 如何判断一个数是否为2的幂?

答案:

2的幂的数二进制中只有一个1,因此:

int isPowerOfTwo(unsigned int n) {

return n && !(n & (n - 1));

}


28. 什么是内联函数?有什么作用?

答案:

内联函数使用`inline`关键字,建议编译器将函数代码直接插入调用处,减少函数调用开销,提高效率。


29. C语言中如何实现字符串反转?

答案:

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--;

}

}


30. 解释C语言中的“extern”关键字。

答案:

`extern`用于声明外部变量或函数,表示该变量或函数在其他文件定义,用于跨文件访问。


总结

本文整理了30道C语言经典面试题,涵盖了基础语法、指针、内存管理、字符串操作、数据结构和关键字等重要知识点。掌握这些题目不仅能够帮助理解C语言核心机制,还能在面试中展现扎实的编程功底。建议读者结合实际编程练习,加深对每个知识点的理解和应用,提升面试成功率。祝你面试顺利!


未经 qmjianli.com 同意,不得转载或采集本站的文章。