【面试系列】C 语言高频面试题

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏:

⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题.
⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、应用领域等内容。
⭐️ 全流程数据技术实战指南:全面讲解从数据采集到数据可视化的整个过程,掌握构建现代化数据平台和数据仓库的核心技术和方法。

文章目录

      • 常见的C语言初级面试题及详细解答
        • 1. **C语言的基本数据类型有哪些?**
        • 2. **如何在C语言中定义和使用指针?**
        • 3. **C语言中的数组和指针有什么关系?**
        • 4. **什么是结构体,如何定义和使用结构体?**
        • 5. **C语言中的内存分配函数有哪些?**
        • 6. **解释C语言中的条件编译和宏定义。**
        • 7. **什么是文件操作,C语言如何进行文件读写?**
        • 8. **如何在C语言中处理字符串?**
        • 9. **解释C语言中的递归函数,并举例说明。**
        • 10. **如何在C语言中处理命令行参数?**
      • 常见的C语言中级面试题及详细解答
        • 1. **解释C语言中的指针数组和数组指针的区别。**
        • 2. **什么是静态变量,如何在C语言中定义和使用?**
        • 3. **解释C语言中的内存对齐以及其重要性。**
        • 4. **什么是`const`指针和指向`const`的指针,如何使用?**
        • 5. **解释`typedef`的作用,并举例说明。**
        • 6. **如何在C语言中实现一个链表,并进行基本的插入和删除操作?**
        • 7. **解释C语言中的动态内存分配,`malloc`和`calloc`的区别。**
        • 8. **什么是递归函数,如何避免递归引起的栈溢出问题?**
        • 9. **解释C语言中的位运算及其常见用途。**
        • 10. **如何在C语言中实现函数指针及其应用?**
      • 常见的C语言高级面试题及详细解答
        • 1. **什么是内存泄漏,如何检测和防止内存泄漏?**
        • 2. **解释C语言中的`volatile`关键字及其应用场景。**
        • 3. **解释C语言中的`inline`函数及其优缺点。**
        • 4. **如何在C语言中实现多线程编程,举例说明线程的创建与同步。**
        • 5. **什么是“深拷贝”和“浅拷贝”?举例说明它们在C语言中的实现。**
        • 6. **解释C语言中的`restrict`关键字及其用途。**
        • 7. **如何在C语言中实现内存池(memory pool)?**
        • 8. **解释C语言中的内联汇编及其用途,举例说明。**
        • 9. **解释C语言中的自定义内存管理器,并举例说明其实现。**
        • 10. **解释C语言中的编译器优化选项及其作用。**
      • 面试中需要掌握的知识点总结
        • 1. 基本语法和结构
        • 2. 指针和内存管理
        • 3. 数据结构
        • 4. 字符串处理
        • 5. 文件操作
        • 6. 高级特性
        • 7. 编译和调试
        • 8. 并发和多线程编程
        • 9. 编程实践

常见的C语言初级面试题及详细解答

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

解答:
C语言的基本数据类型包括整型(int)、字符型(char)、浮点型(float)、双精度浮点型(double)。整型可以进一步分为短整型(short int)、长整型(long int)和无符号整型(unsigned int)。这些基本数据类型构成了C语言处理不同类型数据的基础。

2. 如何在C语言中定义和使用指针?

解答:
指针是存储变量地址的变量。在C语言中,定义指针的语法为<数据类型> *<指针变量名>。例如,int *ptr定义了一个整型指针。使用&运算符获取变量地址并赋值给指针,如ptr = &var。通过解引用运算符*可以访问指针指向的值,如*ptr

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

解答:
数组名在大多数情况下是指向数组第一个元素的指针。例如,int arr[5]定义一个整型数组arrarr即为指向第一个元素的指针,等价于&arr[0]。可以通过指针运算访问数组元素,如*(arr + 1)访问arr[1]

4. 什么是结构体,如何定义和使用结构体?

解答:
结构体(struct)是用户自定义的数据类型,用于存储不同类型的数据。定义结构体的语法为struct <结构体名> { <成员列表> };。例如:

struct Student {
    int id;
    char name[50];
    float gpa;
};

定义结构体变量struct Student student1;,访问成员使用点运算符,如student1.id = 101;

5. C语言中的内存分配函数有哪些?

解答:
C语言中内存分配函数包括malloccallocreallocfreemalloc分配指定字节的内存,calloc分配指定数量且初始化为0的内存块,realloc调整已分配内存大小,free释放已分配的内存。例如:

int *ptr = (int *)malloc(10 * sizeof(int));
if (ptr != NULL) {
    free(ptr);
}
6. 解释C语言中的条件编译和宏定义。

解答:
条件编译和宏定义用于控制代码的编译。宏定义使用#define创建符号常量或宏函数,如#define PI 3.14。条件编译使用预处理指令如#ifdef#ifndef#if#else#elif#endif,根据条件编译特定部分代码。例如:

#define DEBUG
#ifdef DEBUG
    printf("Debug mode\n");
#endif
7. 什么是文件操作,C语言如何进行文件读写?

解答:
文件操作包括文件的打开、读写和关闭。C语言使用fopen打开文件,fclose关闭文件,freadfwrite进行二进制读写,fprintffscanf进行格式化读写。例如:

FILE *file = fopen("data.txt", "r");
if (file != NULL) {
    char buffer[100];
    while (fgets(buffer, 100, file) != NULL) {
        printf("%s", buffer);
    }
    fclose(file);
}
8. 如何在C语言中处理字符串?

解答:
C语言中字符串以字符数组表示,并以空字符'\0'结尾。常用字符串操作函数包括strcpystrcatstrcmpstrlen。例如:

char str1[20] = "Hello";
char str2[20];
strcpy(str2, str1); // 复制str1到str2
strcat(str1, " World"); // 拼接" World"到str1
int len = strlen(str1); // 获取str1的长度
9. 解释C语言中的递归函数,并举例说明。

解答:
递归函数是指在函数内部调用自身的函数。递归函数必须有基例条件,以避免无限递归。例如,计算阶乘的递归函数:

int factorial(int n) {
    if (n == 0) {
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}

调用factorial(5)会计算并返回5的阶乘120。
这些问题涵盖了C语言的基础知识,帮助面试官评估候选人的基础编程能力和理解水平。

10. 如何在C语言中处理命令行参数?

解答:
C语言通过main函数的参数处理命令行参数:int main(int argc, char *argv[])argc表示参数个数,argv是参数数组。例如:

#include <stdio.h>

int main(int argc, char *argv[]) {
    for (int i = 0; i < argc; i++) {
        printf("Argument %d: %s\n", i, argv[i]);
    }
    return 0;
}

执行./program arg1 arg2,将输出参数列表。

常见的C语言中级面试题及详细解答

1. 解释C语言中的指针数组和数组指针的区别。

解答:
指针数组是一个数组,数组元素是指针。例如,int *arr[10]是一个指向整数的指针数组。数组指针是指向数组的指针。例如,int (*ptr)[10]是一个指向包含10个整数的数组的指针。区别在于指针数组是多个指针的集合,而数组指针是指向一个数组的单一指针。

2. 什么是静态变量,如何在C语言中定义和使用?

解答:
静态变量使用关键字static定义,具有静态存储期,生命周期贯穿整个程序运行期间,但其作用域仅限于定义它的函数或文件。例如:

void func() {
    static int count = 0; // 静态变量,仅初始化一次
    count++;
    printf("Count: %d\n", count);
}

调用func函数多次,count变量的值会累积,而不是每次都重置为0。

3. 解释C语言中的内存对齐以及其重要性。

解答:
内存对齐是指在内存中存储数据时,数据的地址要按特定字节边界对齐,以提高数据访问效率。C编译器通常会对结构体进行内存对齐,插入填充字节以确保每个成员在适当的边界上。例如:

struct Example {
    char a;
    int b;
};

在32位系统中,int通常要求4字节对齐,因此在char aint b之间会插入3个字节的填充。

4. 什么是const指针和指向const的指针,如何使用?

解答:
const指针指针自身是常量,不能修改指向的地址。例如,int *const ptr
指向const的指针指针指向的值是常量,不能通过该指针修改指向的值。例如,const int *ptr

int a = 10, b = 20;
const int *ptr1 = &a; // 指向const的指针
int *const ptr2 = &a; // const指针
ptr1 = &b; // 合法
*ptr1 = 30; // 非法
ptr2 = &b; // 非法
*ptr2 = 30; // 合法
5. 解释typedef的作用,并举例说明。

解答:
typedef用于为现有类型定义新的类型名,简化复杂类型的使用。例如:

typedef unsigned long ulong;
ulong a = 100;

此示例中,ulongunsigned long的新类型名,使用更简洁。此外,typedef还可以用于简化复杂的指针和函数指针类型定义。

6. 如何在C语言中实现一个链表,并进行基本的插入和删除操作?

解答:
链表是由节点组成的数据结构,每个节点包含数据和指向下一个节点的指针。以下是链表的实现和基本操作:

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

struct Node {
    int data;
    struct Node *next;
};

void insert(struct Node **head, int data) {
    struct Node *new_node = (struct Node *)malloc(sizeof(struct Node));
    new_node->data = data;
    new_node->next = *head;
    *head = new_node;
}

void delete(struct Node **head, int key) {
    struct Node *temp = *head, *prev;
    if (temp != NULL && temp->data == key) {
        *head = temp->next;
        free(temp);
        return;
    }
    while (temp != NULL && temp->data != key) {
        prev = temp;
        temp = temp->next;
    }
    if (temp == NULL) return;
    prev->next = temp->next;
    free(temp);
}

void printList(struct Node *node) {
    while (node != NULL) {
        printf("%d -> ", node->data);
        node = node->next;
    }
    printf("NULL\n");
}
7. 解释C语言中的动态内存分配,malloccalloc的区别。

解答:
动态内存分配允许程序在运行时分配内存。malloc分配指定字节的未初始化内存,calloc分配指定数量的元素,并初始化为0。区别在于初始化和参数:

int *ptr1 = (int *)malloc(10 * sizeof(int)); // 分配10个整型大小的未初始化内存
int *ptr2 = (int *)calloc(10, sizeof(int)); // 分配并初始化为0的10个整型大小内存

malloc需要一个参数(总字节数),calloc需要两个参数(元素数量和每个元素的字节数)。

8. 什么是递归函数,如何避免递归引起的栈溢出问题?

解答:
递归函数是指在其自身内部调用自身的函数。递归函数需要基例条件来结束递归,否则可能引起栈溢出。避免递归引起的栈溢出可以通过优化递归深度、使用尾递归或将递归改写为迭代。例如,计算阶乘的递归和迭代实现:

int factorial(int n) {
    if (n == 0) return 1;
    return n * factorial(n - 1);
}

int factorial_iterative(int n) {
    int result = 1;
    for (int i = 1; i <= n; i++) {
        result *= i;
    }
    return result;
}
9. 解释C语言中的位运算及其常见用途。

解答:
位运算是对二进制位进行操作,包括与(&)、或(|)、异或(^)、非(~)、左移(<<)和右移(>>)。常见用途包括设置、清除和检查特定位。例如:

int a = 5; // 0101
int b = a << 1; // 左移1位,结果为1010(10)
int c = a & 1; // 检查最低位是否为1,结果为1
int d = a | 8; // 设置第4位,结果为1101(13)

位运算常用于低级编程、位掩码和位字段操作。

10. 如何在C语言中实现函数指针及其应用?

解答:
函数指针是指向函数的指针,可以动态调用函数。在C语言中,函数指针定义语法为<返回类型> (*<指针名>)(<参数列表>)。例如:

#include <stdio.h>

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

int subtract(int a, int b) {
    return a - b;
}

int main() {
    int (*func_ptr)(int, int); // 定义函数指针
    func_ptr = add; // 将指针指向add函数
    printf("Add: %d\n", func_ptr(2, 3)); // 调用add函数

    func_ptr = subtract; // 将指针指向subtract函数
    printf("Subtract: %d\n", func_ptr(5, 2)); // 调用subtract函数

    return 0;
}

函数指针常用于回调函数、动态函数调用和实现多态性。

这些中级问题帮助评估候选人对C语言的更深入理解和应用能力,涵盖了内存管理、数据结构、函数指针和位运算等重要主题。

常见的C语言高级面试题及详细解答

1. 什么是内存泄漏,如何检测和防止内存泄漏?

解答:
内存泄漏是指程序在运行过程中分配了内存但未能释放,导致内存占用逐渐增加。内存泄漏会降低系统性能,甚至导致程序崩溃。检测内存泄漏的方法包括使用工具如Valgrind、AddressSanitizer等。防止内存泄漏的方法包括确保每次malloccalloc分配的内存都有对应的free调用,尽量使用智能指针(在支持的环境中),进行严格的代码审查和测试。

2. 解释C语言中的volatile关键字及其应用场景。

解答:
volatile关键字告诉编译器变量可能在任何时间被外部因素修改,因此编译器不能对该变量进行优化。常见应用场景包括:

  • 硬件寄存器地址映射,如嵌入式系统中的I/O端口
  • 多线程编程中的共享变量,避免编译器优化导致的读取缓存问题
    例如:
volatile int flag = 0; // 该变量可能在另一个线程中被修改
while (!flag) {
    // Do something
}

在这个例子中,编译器不会将flag变量的读取操作优化为缓存的读取,而是每次都从内存中读取。

3. 解释C语言中的inline函数及其优缺点。

解答:
inline关键字用于建议编译器将函数体直接插入到调用处,减少函数调用的开销。优点包括减少函数调用的开销、提高代码执行速度。缺点是可能导致代码膨胀,增加编译时间和最终的二进制文件大小。使用示例:

inline int add(int a, int b) {
    return a + b;
}
int main() {
    int result = add(3, 4); // 编译器可能将add函数的代码直接插入到此处
    return 0;
}

需要注意,inline只是建议,编译器可能会忽略。

4. 如何在C语言中实现多线程编程,举例说明线程的创建与同步。

解答:
C语言中多线程编程通常使用POSIX线程(pthread)库。创建线程使用pthread_create函数,同步线程使用互斥锁(mutex)或条件变量。示例如下:

#include <pthread.h>
#include <stdio.h>

void *print_message(void *ptr) {
    printf("%s\n", (char *)ptr);
    return NULL;
}

int main() {
    pthread_t thread1, thread2;
    char *message1 = "Thread 1";
    char *message2 = "Thread 2";

    pthread_create(&thread1, NULL, print_message, (void *)message1);
    pthread_create(&thread2, NULL, print_message, (void *)message2);

    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    return 0;
}

在此例中,pthread_create函数创建两个线程,pthread_join函数等待线程完成。

5. 什么是“深拷贝”和“浅拷贝”?举例说明它们在C语言中的实现。

解答:
浅拷贝是指复制对象的值,但不复制指向的内存,两个对象共享同一内存。深拷贝是指不仅复制对象的值,还复制对象指向的内存,两个对象独立。示例如下:

// 浅拷贝
typedef struct {
    int *data;
} ShallowCopy;

ShallowCopy shallow_copy(ShallowCopy src) {
    ShallowCopy dest;
    dest.data = src.data;
    return dest;
}

// 深拷贝
typedef struct {
    int *data;
} DeepCopy;

DeepCopy deep_copy(DeepCopy src) {
    DeepCopy dest;
    dest.data = (int *)malloc(sizeof(int));
    *(dest.data) = *(src.data);
    return dest;
}

在深拷贝中,malloc分配新的内存,并复制源对象的数据。

6. 解释C语言中的restrict关键字及其用途。

解答:
restrict关键字是C99引入的,用于指示指针是访问对象的唯一方法,允许编译器进行更激进的优化。使用restrict指针,编译器假设没有别的指针会访问同一块内存,从而可以优化代码。例如:

void add_arrays(int *restrict a, int *restrict b, int *restrict c, size_t n) {
    for (size_t i = 0; i < n; i++) {
        c[i] = a[i] + b[i];
    }
}

在此例中,编译器可以假设abc指向的内存不会重叠,优化内存访问。

7. 如何在C语言中实现内存池(memory pool)?

解答:
内存池是一种内存管理机制,预先分配大块内存并按需分配小块内存,以提高内存分配和释放的效率。示例如下:

#include <stdlib.h>

#define POOL_SIZE 1024

typedef struct {
    char pool[POOL_SIZE];
    size_t offset;
} MemoryPool;

void *pool_alloc(MemoryPool *pool, size_t size) {
    if (pool->offset + size <= POOL_SIZE) {
        void *ptr = pool->pool + pool->offset;
        pool->offset += size;
        return ptr;
    } else {
        return NULL; // 内存不足
    }
}

void pool_free(MemoryPool *pool) {
    pool->offset = 0;
}

int main() {
    MemoryPool pool = { .offset = 0 };
    int *a = (int *)pool_alloc(&pool, sizeof(int));
    *a = 42;
    pool_free(&pool);
    return 0;
}

在此例中,pool_alloc函数从内存池中分配内存,pool_free重置内存池。

8. 解释C语言中的内联汇编及其用途,举例说明。

解答:
内联汇编允许在C代码中嵌入汇编指令,通常用于性能优化或访问硬件级功能。GCC编译器支持__asm____asm语法。例如:

#include <stdio.h>

int main() {
    int a = 5, b = 10, result;
    __asm__ (
        "addl %%ebx, %%eax;"
        : "=a" (result)
        : "a" (a), "b" (b)
    );
    printf("Result: %d\n", result);
    return 0;
}

在此例中,内联汇编将寄存器ebx的值加到eax,结果存储在result中。

9. 解释C语言中的自定义内存管理器,并举例说明其实现。

解答:
自定义内存管理器可以提高内存分配效率,减少碎片化。实现包括自定义mallocfree函数,管理内存块。示例如下:

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

#define MEMORY_SIZE 1024

char memory[MEMORY_SIZE];
size_t memory_offset = 0;

void *my_malloc(size_t size) {
    if (memory_offset + size <= MEMORY_SIZE) {
        void *ptr = memory + memory_offset;
        memory_offset += size;
        return ptr;
    } else {
        return NULL; // 内存不足
    }
}

void my_free(void *ptr) {
    // 自定义内存管理器通常不支持单独释放内存块
    // 此示例仅演示基本原理
}

int main() {
    int *a = (int *)my_malloc(sizeof(int));
    if (a) {
        *a = 42;
        printf("Value: %d\n", *a);
    }
    return 0;
}

在此例中,my_malloc从预分配的内存块中分配内存。

10. 解释C语言中的编译器优化选项及其作用。

解答:
编译器优化选项用于控制编译器的优化级别,提高生成代码的性能和效率。常见优化选项包括:

  • -O0:无优化,便于调试
  • -O1:基本优化,平衡编译时间和执行速度
  • -O2:更多优化,提高执行速度
  • -O3:激进优化,可能增加代码大小
  • -Os:优化生成代码大小

例如,使用GCC编译器进行优化:

gcc -O2

 -o my_program my_program.c

在此例中,-O2选项启用更多优化,提高生成代码的执行速度。不同优化级别适用于不同场景,根据需要选择合适的优化级别。

这些高级问题涵盖了内存管理、编译器优化、多线程编程、内联汇编等高级主题,评估候选人对C语言的深入理解和应用能力。

面试中需要掌握的知识点总结

C语言是一种功能强大且灵活的编程语言,被广泛应用于系统编程、嵌入式系统开发、游戏开发等领域。要在C语言面试中脱颖而出,候选人需要掌握以下关键知识点:

1. 基本语法和结构
  • 数据类型:理解基本数据类型(如intcharfloatdouble)及其大小,熟悉枚举、结构体和联合体的定义和使用。
  • 变量和常量:掌握变量声明、定义和初始化,了解常量和const关键字的使用。
  • 控制结构:熟悉if-elseswitch-caseforwhiledo-while等控制结构的使用及其语法。
  • 函数:理解函数的定义、声明、参数传递方式(按值传递和按引用传递)、递归函数及其应用。
2. 指针和内存管理
  • 指针基础:理解指针的概念、指针运算、指针与数组的关系。
  • 指针高级:掌握指向指针的指针、指针数组、数组指针、函数指针的定义和使用。
  • 动态内存分配:熟悉malloccallocreallocfree函数的使用,理解内存泄漏及其检测方法。
  • 内存模型:了解堆栈内存分配、局部变量和全局变量的存储位置及其生命周期。
3. 数据结构
  • 数组:理解一维数组和多维数组的声明、初始化和访问方式。
  • 链表:掌握单链表、双链表和循环链表的基本操作(如插入、删除、遍历)。
  • 栈和队列:理解栈和队列的基本概念及其基于数组和链表的实现。
  • 树和图:了解二叉树、二叉搜索树的基本操作,理解图的表示方法(邻接矩阵和邻接表)。
4. 字符串处理
  • 字符串基础:熟悉C语言中的字符串定义、初始化和常用操作(如strlenstrcpystrcatstrcmp)。
  • 字符串操作:掌握字符串操作函数的实现原理和可能的边界条件(如缓冲区溢出)。
5. 文件操作
  • 文件指针:理解文件指针的概念及其使用(如FILE *fp)。
  • 文件操作函数:熟悉文件打开(fopen)、关闭(fclose)、读(freadfgetsfscanf)、写(fwritefputsfprintf)及其相关函数的使用。
6. 高级特性
  • 宏和预处理器指令:掌握宏定义(#define)、宏函数、条件编译(#ifdef#ifndef#endif)的使用。
  • 位操作:理解位运算符(如&|^~<<>>)及其应用,掌握位掩码和位字段操作。
  • 内联汇编:了解在C语言中嵌入汇编代码的方法及其应用场景。
7. 编译和调试
  • 编译过程:理解C语言的编译过程,包括预处理、编译、汇编和链接,了解生成可执行文件的步骤。
  • 调试工具:熟悉常用调试工具(如GDB)的使用,掌握基本调试命令(如断点设置、单步执行、查看变量值)。
8. 并发和多线程编程
  • 线程创建与管理:理解线程的基本概念,掌握线程的创建(如pthread_create)、同步(如互斥锁、条件变量)及其使用。
  • 并发控制:了解常见的并发问题(如死锁、竞态条件)及其解决方法。
9. 编程实践
  • 代码优化:掌握常见的代码优化技巧,理解内联函数、循环展开、减少内存访问等优化方法。
  • 代码风格:了解良好的代码风格和编码规范,掌握代码注释、命名规范、代码模块化等最佳实践。

掌握上述知识点不仅能够帮助候选人在C语言面试中应对各种问题,还能提升他们在实际开发中的编程能力和解决问题的技巧。通过不断练习和积累经验,候选人可以在C语言编程领域中脱颖而出。


💗💗💗 如果觉得这篇文对您有帮助,请给个点赞、关注、收藏吧,谢谢!💗💗💗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/760341.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

老师如何发布期末成绩查询

期末成绩的发布总是让人既期待又紧张。但别担心&#xff0c;今天我就来和大家分享一下如何高效、准确地发布期末成绩查询&#xff0c;让家长和学生都能轻松查到成绩&#xff0c;同时也减轻你的工作负担。 整理成绩数据是关键。确保你的成绩单是最新的&#xff0c;并且已经经过仔…

架构师篇-10、DDD实战篇:通过领域模型落地系统

基于领域模型的设计与开发 数据库设计程序设计微服务设计 在线订餐系统的领域事件通知 微服务拆分 事件风暴会议 梳理领域事件进行领域建模识别聚合关系划分限界上下文 用户下单领域模型 更新后的模型 领域模型的设计实现过程 数据库设计 数据库映射&#xff1a;一对一关系…

【Mac】Auto Mouse Click for Mac(高效、稳定的鼠标连点器软件)软件介绍

软件介绍 Auto Mouse Click for Mac 是一款专为 macOS 平台设计的自动鼠标点击软件&#xff0c;它可以帮助用户自动化重复的鼠标点击操作&#xff0c;从而提高工作效率。以下是这款软件的主要特点和功能&#xff1a; 1.自动化点击操作&#xff1a;Auto Mouse Click 允许用户录…

【硬件视界2】CPU和GPU:计算机架构的双子星

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 本篇笔记整理&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、CPU (中央处理器)①主要作用②特点 2、 GPU (图形处理…

Workerman在线客服系统源码,附搭建教程

源码介绍&#xff1a; Workerman在线客服系统源码。 workerman是一个高性能的PHP socket 服务器框架&#xff0c;workerman基于PHP多进程以及libevent事件轮询库&#xff0c;PHP开发者只要实现一两个接口&#xff0c;便可以开发出自己的网络应用&#xff0c;例如Rpc服务、聊天…

气膜仓库的优势与应用—轻空间

随着现代物流和存储需求的不断增长&#xff0c;传统仓库的建设和运营成本日益增加&#xff0c;企业需要寻找更加灵活、高效和经济的解决方案。在这种背景下&#xff0c;气膜仓库作为一种新型仓储形式&#xff0c;以其独特的优势和广泛的应用前景&#xff0c;逐渐受到市场的青睐…

Hadoop3:Yarn配置任务的优先级

一、需求说明 配置队列优先级 容量调度器&#xff0c;支持任务优先级的配置&#xff0c;在资源紧张时&#xff0c;优先级高的任务将优先获取资源。默认情况&#xff0c;Yarn将所有任务的优先级限制为0&#xff0c;若想使用任务的优先级功能&#xff0c;须开放该限制。 二、修…

【STM32嵌入式系统设计与开发---传感器拓展】——1_4_标准库FreeRTOS移植实验

目录 雅俗理解源码下载链接知识拓展步骤1&#xff1a;stm32f103vet6移植freeRTOS步骤:&#xff08;1&#xff09;准备开发环境&#xff08;2&#xff09;添加FreeRTOS移植 致谢 雅俗理解 雅&#xff1a;FreeRTOS是一个开源的实时操作系统&#xff08;RTOS&#xff09;&#xf…

index()方法——字符串首次出现的索引位置

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 index()方法用于查询一个字符串在其本身字符串对象中首次出现的索引位置。它与find()方法功能相同&#xff0c;区别在于当find()方法没有检…

数据产品经理知识库构建

概述 数据产品经理是企业中负责管理和推动数据产品的专业人员。他们利用数据来辅助决策&#xff0c;优化产品&#xff0c;提升用户体验。用STAR法则&#xff08;Situation, Task, Action, Result&#xff09;来介绍数据产品经理的角色&#xff0c;应该学习的数据产品&#…

cookie 的获取过程

#第一次请求过程 浏览器第一次发送请求时,不会携带任何cookie信息 服务器接收到请求之后&#xff0c;发现请求中没有任何cookie信息 服务器生成和设置一个cookie.并将此cookie设置通过set_cookie的首部字段保存在响应报文中返回给浏 览器 浏览器接收到这个响应报文之后,发现里…

人工智能 (AI) 在能源系统中应用的机会和风险

现代文明极度依赖于电力的获取。电力系统支撑着我们视为理所当然的几乎所有基本生活功能。没有电力的获取&#xff0c;大多数经济活动将是不可能的。然而&#xff0c;现有的电网系统并未设计来应对当前——更不用说未来的——电力需求。与此同时&#xff0c;气候变化迫切要求我…

1.linux操作系统CPU负载

目录 概述CPU平均负载查看平均负载结束 概述 CPU 使用率 和CPU 平均使用率。 CPU平均负载 单位时间内系统处于 [可运行状态] 和 [不可中断状态] 的平均进程数&#xff0c;就是平均活跃进程数&#xff0c;和CPU使用率并没有直接关系 可运行状态 正在使用CPU或者正等待CPU的进…

vscode 开发qt6 开发环境搭建

vscode代码编辑器有自己一些优势&#xff0c;考虑用它开发qt6项目&#xff1a; 整个配置过程如下&#xff1a; 插件安装&#xff1a; .mingw&cmake安装配置: qt creator 创建一个测试工程&#xff0c;当然&#xff0c;工程是cmake类型 &#xff1a; vsocode 打开cmakeLis…

❤ Gitee平台的使用

Gitee平台的使用 文章目录 Gitee平台的使用一、Gitee的注册1、注册2、添加邮箱 二、仓库的创建 和 团队成员的添加1、单击右上角的 **&#xff0b;** 号 、创建仓库2、如下填写即可 三、仓库克隆到本地1、安装好git 和 小乌龟&#xff08;TortoiseGit&#xff09;2、打开仓库 复…

计算机Java项目|基于SpringBoot的作业管理系统设计与实现

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、Python项目、前端项目、人工智能与大数据、简…

ThreadPoolExecutor 线程回收时机详解

个人博客 ThreadPoolExecutor 线程回收时机详解 | iwts’s blog 总集 想要完整了解下ThreadPoolExecutor&#xff1f;可以参考&#xff1a; 基于源码详解ThreadPoolExecutor实现原理 | iwts’s blog Worker-工作线程管理 线程池设计了内部类Worker&#xff0c;主要是用来…

python 压缩数据

requests 是 Python 中一个非常流行的 HTTP 库&#xff0c;用于发送各种 HTTP 请求。下面是一个使用 requests 库发送简单 GET 请求和 POST 请求的示例&#xff1a; 首先&#xff0c;确保你已经安装了 requests 库。如果还没有安装&#xff0c;可以使用 pip 进行安装&#xff…

独辟蹊径:我是如何用Java自创一套工作流引擎的(下)

作者&#xff1a;后端小肥肠 创作不易&#xff0c;未经允许严禁转载。 姊妹篇&#xff1a;独辟蹊径&#xff1a;我是如何用Java自创一套工作流引擎的&#xff08;上&#xff09;_java工作流引擎-CSDN博客 1. 前言 在上一篇博客中&#xff0c;我们详细介绍了如何利用Java语言从…

Zookeeper 四、Zookeeper应用场景

Zookeeper是一个典型的发布/订阅模式的分布式数据管理与协调框架&#xff0c;我们可以使用它来进行分布式数据的发布与订阅。另一方面&#xff0c;通过对Zookeeper中丰富的数据节点类型进行交叉使用&#xff0c;配合Watcher事件通知机制&#xff0c;可以非常方便地构建一系列分…