1.static
是C和C++语言中的一个关键字,用于定义静态变量、静态函数和限定符。
静态变量被初始化一次,并且在每次函数调用时保持其值。它们通常用于在函数调用之间共享数据。它们通常用于在函数调用之间共享数据。
(1)在C语言中,使用static
修饰全局变量(此时在静态内存区的)时,意味着该变量只能在声明它的文件中使用,其他文件无法访问。
(2)在函数内部使用static
修饰局部变量时,意味着该变量将保持在函数执行结束后继续存在,不会被自动释放,同时只能在该函数内部使用,其他函数无法访问该变量。
(3)需要注意的是,static
并非线程安全的,即多个线程同时访问同一个静态变量或函数时,可能会导致竞争条件和数据混乱等问题。因此,在多线程编程中,需要使用互斥锁等机制来保护静态变量的访问
2.const
3.结构体
结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。
4.共用体
共用体(Union)是一种特殊的数据类型,可以在同一内存空间中存储不同类型的数据。共用体的所有成员共享同一块内存区域,但每次只能使用其中一个成员。
共同体作用:让几个不同类型的变量共享同一个内存地址。
共用体所占内存大小:共用体所占内存的大小即公用体中长度最大元素所占用的字节数。
联合体(共用体)有一个特点:不能同时使用,因为他们使用的是同一块空间,给 a 赋值时会改变 i 的值,给 i 赋值会改变 a 的值。
5.数组与链表的区别
数组(Array)和链表(Linked List)是两种常见的数据结构,它们在存储和访问数据时有一些区别。
数组是一种连续的、固定大小的数据结构,其中相同类型的元素按顺序存储在内存中。数组的元素可以通过索引直接访问,索引从0开始。数组具有以下特点:
- 随机访问:可以通过索引直接访问数组的任何元素,时间复杂度为O(1)。
- 固定大小:数组在创建时需要指定大小,并且大小不能随意改变。
- 内存连续:数组的元素在内存中是连续存储的,这也是支持随机访问的基础。
链表是一种非连续的、动态分配的数据结构,其中每个节点包含数据和指向下一个节点的指针。链表的节点在内存中可以是分散的,而不像数组那样连续存储。链表具有以下特点:
- 顺序访问:链表需要从头开始遍历,才能访问特定位置的元素,时间复杂度为O(n),其中n是链表长度。
- 动态分配:链表的节点可以在运行时动态创建和释放,使得链表的大小可以随意改变。
- 灵活插入和删除:相比数组,链表更适合频繁的插入和删除操作,因为只需要改变指针的指向,而不需要移动节点。
综上所述,数组适用于已知大小并且需要快速随机访问的情况,而链表适用于需要频繁插入和删除元素、大小可能变化的情况。根据具体的需求和操作特点,选择合适的数据结构可以提高程序的效率和灵活性。
在C语言中,数组通常存储在栈(Stack)或堆(Heap)区。具体取决于数组的声明方式和作用域。
-
栈(Stack)区:当在函数内部或者代码块中声明一个局部数组时,数组会被分配在栈上。栈上的数组的内存分配是自动的,它们的生命周期与所在的函数或代码块相关联。当函数或代码块结束时,栈上的数组自动释放。
-
堆(Heap)区:如果使用动态内存分配函数(如malloc()、calloc()等)显式地分配数组内存,则数组将存储在堆上。堆上的数组的内存分配是手动控制的,需要手动释放内存以防止内存泄漏。
链表通常存储在堆(Heap)区。链表是一种动态数据结构,其节点的内存分配是通过动态内存分配函数(如malloc()、calloc()等)在堆上进行的。
6.c语言存储五大区
-
栈区(Stack):
- 存放函数的局部变量、函数参数和函数调用时的临时数据。
- 栈区的大小在程序运行时动态管理。
- 具有后进先出(LIFO)的特性,函数的局部变量随着函数的结束而自动释放。
- 空间相对较小,适合存储相对较小的数据。
-
堆区(Heap):
- 用于动态分配内存,通过malloc()、calloc()等函数进行分配。
- 堆区的大小在程序运行时动态管理,可以根据需要进行扩展或缩小。
- 需要手动管理内存的分配和释放,以避免内存泄漏。
- 空间相对较大,适合存储较大的数据结构。
-
全局区(Global Area)或静态数据区:
- 存放全局变量、静态变量和常量。
- 在程序启动时分配,并在程序结束时释放。
- 存储在全局数据区,其大小在编译时确定。
- 全局变量的作用域覆盖整个程序。
-
常量区(Constant Area):
- 存放字符串常量和其他常量。
- 字符串常量在程序启动时分配,并在程序结束时释放。
- 常量存储在只读的内存区域,不允许修改。
-
代码区(Code Area)或文本区:
- 存放可执行的机器指令。
- 在程序运行之前就已经存在,并且只读。
- 存放函数体的二进制代码。
7.数组与指针的区别
-
数据类型不同:数组是一组相同数据类型的数据集合,而指针是指向某一数据类型的内存地址。
-
内存分配方式不同:数组在定义时需要指定数组长度,并且在程序运行时会自动分配连续的内存空间;而指针在定义时只是占据了一段内存空间,需要通过malloc()、calloc()等函数进行动态内存分配。也可以直接指向一个已经存在的内存地址。
-
存储方式不同:数组在内存中存储为一段连续的内存空间,所有的元素都在一起;而指针只存储指向所指数据类型的内存地址。
-
操作方式不同:对数组的操作可以使用数组下标访问元素,也可以通过指针访问数组元素;而对指针的操作主要是通过解引用操作符 "*" 或 "->" 来访问指向的内存空间。
-
参数传递方式不同:数组作为函数参数时,实际上传递的是数组首元素的地址,因此在函数内部可以直接对数组进行操作;而指针作为函数参数时,需要传递指针的地址,才能在函数内部改变指针的值。
8.互斥信号量和二值信号量
-
互斥信号量(Mutex Semaphore):互斥信号量是一种用于协调多个进程或线程访问共享资源的同步工具。它使用一个计数器来控制对临界资源的访问,只允许一个进程/线程在任意时刻访问共享资源。当一个进程/线程请求该资源时,它需要对互斥信号量进行加锁操作,访问结束后再释放锁。
-
二值信号量(Binary Semaphore):二值信号量也是一种用于同步多个进程或线程的同步工具。它与互斥信号量不同的是,二值信号量只有两个状态,分别是0和1。当一个进程/线程请求该资源时,如果信号量值为1,则可以访问共享资源并将信号量值设为0;否则需要等待其他进程/线程释放该资源并将信号量值设为1。
在实际应用中,互斥信号量和二值信号量也有着各自的应用场景。例如,互斥信号量常用于保护对共享资源的访问,防止多个进程/线程同时访问同一个资源而引发冲突;而二值信号量则常用于防止竞态条件的出现,即避免多个进程/线程同时访问同一个资源而引发死锁。
9.全局变量与局部变量初值
全局变量如果没有进行显式的初始化操作,将会以0值进行默认初始化。
在C语言中,如果局部变量没有进行显式的初始化操作,其初始值是不确定的,即未定义行为。这意味着编译器不会为未初始化的局部变量提供一个确定的默认值,而是将其值设置为当前内存中的任意值,可能是之前使用该内存位置时留下的值。
10.extern
extern
是C语言中用于声明外部变量或函数的关键字。
1.extern是C语言的一个关键字,可以用来修饰函数与变量
2.当extern修饰一个变量或函数时时,就是在声明这个变量(函数),告诉编译器在外部文件中已经这个变量(函数),要通过编译。
11.volatitle
在编程领域中,"volatile"是一个关键字,通常用于声明变量。它的作用是告诉编译器和优化器该变量可能在程序执行过程中被意外修改,因此编译器不应对该变量进行优化,而是将其从寄存器中读取或写入到内存中。
具体来说,"volatile"有以下几个作用:
-
防止编译器优化:编译器在优化代码时会将变量存储在寄存器中,而不是每次都从内存中读取。然而,某些变量的值可能会由于程序之外的原因而改变,比如多线程或硬件中断等。使用"volatile"关键字可以告诉编译器,在访问这些变量时必须从内存中读取或写入,避免了使用过期或无效的数据。
-
确保可见性:多线程环境下,当一个线程修改了一个"volatile"变量的值,其他线程能够立即看到最新的值。这是因为"volatile"变量的读取和写入操作会直接作用于主内存,而不是线程的本地缓存。
需要注意的是,"volatile"关键字并不能解决所有的并发问题,它只能确保可见性。对于涉及到多个变量之间的原子性操作,还需要使用其他同步机制,如锁或原子操作。
总之,"volatile"关键字的作用是告诉编译器该变量可能会被外部因素修改,不应进行优化,并确保多线程环境下的可见性。
12.二极管和三极管和CMOS管
二极管、三极管和CMOS管都是电子器件,它们在工作中发挥着不同的作用。
二极管是最基本的电子器件之一,它只允许电流从一个方向流过,即正向偏压时电流通过,反向偏压时电流被阻断。它的工作原理是基于半导体材料(如硅或锗)的特性,当加正向电压时,即P区与N区之间的电压为正,电压克服内电场的阻力,载流子通过界面,形成电流。当加反向电压时,即P区与N区之间的电压为负,内电场强于外电场,阻止载流子通过界面,形成反向饱和电流。
三极管是电子放大器件,它有三个电极:发射极、基极和集电极。以共射级三极管放大电路为例,可以把两个PN结理解为两道阻碍自由电子运动的河流,发射极为自由电子的“源头”,集电极为一个“抽水泵”,在源源不断的抽取电子。当加正向电压时(即基极与发射极之间的电压为正),电子从发射极流向集电极,形成电流。当加反向电压时(即基极与发射极之间的电压为负),电子无法从发射极流向集电极,电路处于截止状态。
三极管是一种三端半导体器件,由PNP或NPN型晶体管构成。它可以作为电路中的放大器、开关或稳压器等元件,广泛应用于电路和电子设备中。
在三极管中,通常有三个电极:发射极(Emitter)、基极(Base)和集电极(Collector)。其中,PNP型三极管中,发射极为N型材料,基极和集电极为P型材料;而NPN型三极管中,发射极为P型材料,基极和集电极为N型材料。
当三极管中的基极接收到输入信号时,它会控制电流从发射极进入基极,并经过集电极流回电源。如果将三极管接入电路中的放大器部分,可以通过增强输入信号的幅度和增益来输出放大后的信号。如果将三极管作为开关使用,可以通过打开或关闭电路中的三极管来控制电流的流动状态。
此外,三极管还可以作为稳压器使用。稳压器通常由一个三极管、一个稳定电压源和若干个电阻构成,可以输出稳定的电压以供电路中其他元件使用。在这种情况下,三极管的发射极被连接到稳定电压源,而基极和集电极则通过电阻连接到电路中的负载。
因为三极管结构简单、功耗低和工作稳定等优点,所以它广泛应用于各种电路和通信设备中,如放大器、开关、逆变器和稳压器等。
CMOS管是一种集成电路器件,它具有高电阻、低功耗、高速和抗干扰等优点。CMOS管的内部结构是互补对称的,它的工作原理是基于半导体材料和电路元件的组合。当加正向电压时(即阳极与阴极之间的电压为正),电子从阴极流向阳极,电路导通。当加反向电压时(即阳极与阴极之间的电压为负),电子无法从阴极流向阳极,电路截止。
总之,二极管、三极管和CMOS管在电路中各有不同的作用和工作原理。二极管主要起整流和开关的作用;三极管主要起放大信号的作用;CMOS管则是一种集成电路器件,主要用于实现数字逻辑电路和高性能模拟电路。