📜  C编程面试常见问题套装2(1)

📅  最后修改于: 2023-12-03 15:14:26.692000             🧑  作者: Mango

C编程面试常见问题套装2

作为一名程序员,在找工作或升职方面,面试是必不可少的环节。这篇文章介绍了一些C编程面试中常见的问题,以帮助程序员在面试中取得成功。

1. C语言中指针的作用及使用

指针在C语言中非常重要,因为C语言中没有引用类型。指针可以让程序员访问内存中的任何位置,从而实现高效的数据结构和算法。指针定义的语法如下:

type *ptr;

其中"type"为指针变量所指向的数据类型,"ptr"表示声明一个指向"type"类型的指针变量,可以通过"&"运算符获得变量的地址。指针变量可以通过""运算符间接访问所指向的值。

下面是一些C语言中常见的指针使用场景:

  • 函数参数传递:通过将参数声明为指针可以让函数修改调用者提供的变量。
  • 动态内存分配:通过malloc()、calloc()等函数可以在堆上动态分配内存,返回的是指向分配内存的指针。
  • 数组操作:数组名是指向数组第一个元素的指针,可以通过指针访问数组中的元素。

下面是一个指针的例子:

#include <stdio.h>

int main() {
    int a = 10;
    int *ptr = &a;
    printf("a的值:%d\n", a);
    printf("ptr指向的值:%d\n", *ptr);
    return 0;
}

输出:

a的值:10
ptr指向的值:10
2. C语言中的内存模型

内存模型指的是C语言中变量和内存的关系。在C语言中,每个变量都有一个内存地址,可以通过指针访问。C语言中的内存分为四个区域:栈、堆、全局变量区和常量区。

  • 栈区:存储函数调用时的局部变量、函数参数和返回地址等。这些变量的生命周期和函数的调用有关。
  • 堆区:存储动态分配的内存,如通过malloc()和calloc()等函数动态分配的内存。
  • 全局变量区:存储全局变量和静态变量,这些变量的生命周期和程序的执行周期有关。
  • 常量区:存储常量字符串和其他常量。

以下是内存模型的示例:

#include <stdio.h>

int global_var;
static int static_global_var;

int main() {
    int num = 10;
    static int static_var;
    int *ptr = (int *)malloc(sizeof(int));
    char *str = "hello";
    const char * const_str = "world";
    printf("&num地址:%p\n", &num);
    printf("&static_var地址:%p\n", &static_var);
    printf("&global_var地址:%p\n", &global_var);
    printf("&static_global_var地址:%p\n", &static_global_var);
    printf("&ptr地址:%p\n", &ptr);
    printf("&str地址:%p\n", &str);
    printf("&const_str地址:%p\n", &const_str);
    return 0;
}

输出:

&num地址:0x7ffd7041b5e0
&static_var地址:0x55fc0814f018
&global_var地址:0x55fc080bc040
&static_global_var地址:0x55fc080bc044
&ptr地址:0x7ffd7041b5d8
&str地址:0x7ffd7041b5d0
&const_str地址:0x55fc0814c078
3. C语言中常见的数据结构及其实现

C语言中常见的数据结构有数组、链表、栈、队列、哈希表、二叉树等。

以下是链表的实现示例:

#include <stdio.h>
#include <stdlib.h>

// 链表节点定义
struct ListNode {
    int val;
    struct ListNode *next;
};

// 创建一个新的链表节点
struct ListNode * createNode(int val) {
    struct ListNode *node = (struct ListNode *) malloc(sizeof(struct ListNode));
    node->val = val;
    node->next = NULL;
    return node;
}

// 在链表末尾添加一个节点
struct ListNode * addNode(struct ListNode *head, int val) {
    struct ListNode *node = createNode(val);
    if (head == NULL) {
        return node;
    }
    struct ListNode *p = head;
    while (p->next != NULL) {
        p = p->next;
    }
    p->next = node;
    return head;
}

// 打印链表
void printList(struct ListNode *head) {
    struct ListNode *p = head;
    while (p != NULL) {
        printf("%d ", p->val);
        p = p->next;
    }
    printf("\n");
}

int main() {
    struct ListNode *head = NULL;
    head = addNode(head, 1);
    head = addNode(head, 2);
    head = addNode(head, 3);
    printList(head);
    return 0;
}

输出:

1 2 3
4. C语言中常见的算法及其实现

C语言中常见的算法有排序算法、字符串算法、树遍历算法、图算法等。以下是快排的实现示例:

#include <stdio.h>

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int partition(int arr[], int low, int high) {
    int pivot = arr[high];
    int i = low - 1;
    for (int j = low; j <= high - 1; j++) {
        if (arr[j] <= pivot) {
            i++;
            swap(&arr[i], &arr[j]);
        }
    }
    swap(&arr[i + 1], &arr[high]);
    return i + 1;
}

void quickSort(int arr[], int low, int high) {
    if (low < high) {
        int pivot = partition(arr, low, high);
        quickSort(arr, low, pivot - 1);
        quickSort(arr, pivot + 1, high);
    }
}

void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[] = {5, 1, 3, 7, 9, 2};
    int n = sizeof(arr) / sizeof(arr[0]);
    quickSort(arr, 0, n - 1);
    printArray(arr, n);
    return 0;
}

输出:

1 2 3 5 7 9
5. C语言中常见的文件操作函数及其用途

C语言中常见的文件操作函数有fopen()、fclose()、fread()、fwrite()、fseek()、ftell()等。以下是一个文件读取的示例:

#include <stdio.h>

int main() {
    FILE *fp = fopen("file.txt", "r");
    char buff[255];
    while (fgets(buff, 255, fp) != NULL) {
        printf("%s", buff);
    }
    fclose(fp);
    return 0;
}

"file.txt"文件内容:

Hello world!
This is a file.

输出:

Hello world!
This is a file.
总结

本文介绍了C语言中常见的面试问题,包括指针、内存模型、数据结构、算法和文件操作等。读者可以根据自己的经验和需要进行补充和深入研究,以便在面试中取得好的成绩。