C语言
文章平均质量分 84
C语言语法及知识点总结
lanhuazui10
这个作者很懒,什么都没留下…
展开
-
container_of宏简介
这里使用的是一个利用编译器技术的小技巧,即先求得结构成员在结构中的偏移量,然后根据成员变量的地址反过来得出主结构体的地址。这句代码意思是用typeof()获取结构体里member成员属性的类型,然后定义一个该类型的临时指针变量__mptr,并将ptr所指向的member的地址赋给__mptr;既不是C语言规范的所要求,也不是某个标准的一部分。((size_t) &((TYPE*)0)->MEMBER) 结合之前的解释,我们可以知道这句话的意思就是求出MEMBER相对于0地址的一个偏移值。转载 2023-10-06 13:05:20 · 241 阅读 · 0 评论 -
函数调用的内部实现操作了什么
在学习函数嵌套调用和递归调用的时候如果不知道每个函数调用干了什么就会很难理解函数连续调用自己或者其他函数到底怎么连续传参的。函数调用其实是两个过程:传入实参给形参并执行被调用函数,调用完成后回到上次被调用函数的下一行位置继续执行原函数,理解这个过程对理解递归调用很重要。原创 2023-05-07 18:39:54 · 126 阅读 · 0 评论 -
va_list可变参数
va_list 是一个字符指针,在代码中可以理解为指向当前参数的一个指针,这里有几个与 va_list 相关的常见的函数。//获取参数,通常放在循环中,依次获取可变参数值,类型为 type 类型,返回值也为 type 类型,(3)然后用 va_arg 返回可变的参数即 va_arg(va_list ap, type)(1)首先在函数里定义 va_list 型的变量 ap,即指向参数的指针;//对va_list变量进行初始化,将ap指针指向参数列表中的第一个参数。转载 2023-04-29 18:17:52 · 472 阅读 · 0 评论 -
由已知结构体里的某个成员名及该成员地址获取该结构体指针
最近在学习数据结构链表,发现在可复用的链表中链表一般还有一个指针域结点,并没有数据域结点,链表的常用操作也只有next域。只是在使用链表时候会再定义一个数据元素结构体,结构体里会包含链表元素,这种操作搞的有点懵,为啥链表常用接口都没有数据的相关操作还可以使用链表,后面仔细想了一下应该只是借助链表来存储了结点的各个地址,而链表是结构体的一个成员,借助结构体成员的地址和偏移地址,可以求得结构体的首地址,然后就可以引用结构体来读取和配置真正的数据信息。以下是转载的https://blog.csdn.net/s转载 2021-05-30 21:30:14 · 824 阅读 · 0 评论 -
结构体直接赋值条件
最近在阅读代码的时候发现有直接使用结构体赋值的地方,比较疑惑,在最初观念里结构体赋值一般通过memcpy或者strcpy实现赋值,网上搜了下,发现结构体赋值只能在相同的结构体类型中才可以下面是一个实例:#include <stdio.h>struct Foo { char a; int b; double c;}foo1, foo2; //define two structs with three different fieldsvo...转载 2021-05-30 20:50:58 · 264 阅读 · 0 评论 -
含有指针类型成员变量的结构体使用事项
含有指针类型成员变量的结构体在实际代码中也是经常遇到的,这篇文章总结了几个注意点,原文链接:https://blog.csdn.net/u012273127/article/details/52388220在C++中经常用到结构体和指针,当定义一个结构体,结构体成员中有指针的时候,需要注意很多。一下分为:结构体初始化、结构体作为函数参数、函数返回值、以及结构体指针的情况进行总结。一、含有指针成员的结构体初始化含有指针成员的结构体初始化的时候,必须给指针成员给一个明确的地址。注意:给指针成员初始化转载 2021-05-30 19:13:04 · 1223 阅读 · 0 评论 -
论void void*及void**类型
1、void的作用c语言中,void为“不确定类型”,不可以用void来声明变量。如:void a = 10;如果出现这样语句编译器会报错:variable or field ‘a’ declared void。在C语言中void 常常用于:对函数返回类型的限定和对函数参数限定: (1)对函数返回类型的限定:当函数不需要返回类型是必须用void 来限定返回类型,限定了函数的返回类型为void后函数不能有返回值;如:void fun(int a); (2)对函数参数类型的限定:当函数不允许接受转载 2021-05-30 18:45:03 · 3622 阅读 · 0 评论 -
static及静态局部变量使用精讲
1. static全局变量与普通的全局变量有什么区别 ? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。 全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。 这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局转载 2020-11-10 00:07:37 · 1619 阅读 · 0 评论 -
C语言运算符优先级
初级运算符( )、[ ]、->、. 高于 单目运算符高于 算数运算符(先乘除后加减) 高于 关系运算符高于逻辑运算符(不包括!)高于条件运算符高于赋值运算符 高于逗号运算符。除了赋值运算符、条件运算符、单目运算符三类的平级运算符之间的结合顺序是从右至左,其他都是从左至右。 优先级 运算符 名称或含义 使用形式 结合方向 说明 ...转载 2020-10-31 15:43:34 · 118 阅读 · 1 评论 -
再论一维数组名,二维数组名及指针联系与区别
一、概念详解:指针:指针与“int a”,“float b”一样,也是一种变量,只是指针变量中存储的是内存单元的地址,这是与“int a”和“float b”的本质区别,C语言的精华就在于指针、结构体和链表。一维数组:定义一维数组之后,即在内存中分配一段连续的地址空间,如C语言中,int num[5],在32位系统中,int占据4个字节,现假设num[0]的地址空间为0x00000004,那么num[1]的地址空间即为0x00000008 (0x00000004 + 4),num[2]的地址空间即为转载 2020-10-31 15:33:49 · 1618 阅读 · 0 评论 -
为什么使用双重指针
一般情况下我们不使用指向指针的指针,因为这带来了操作的复杂性。但有些情况下我们不得不用。当指针作为一个函数的参数输出时,它的作用就显示出来了。例如:设计一个函数:void fun1(char sz[], char search, char * pa)要求:这个函数参数中的数组array是以0值为结束的字符串,要求在字符串sz中查找字符是参数search里的字符。如果找到,函数通过第三个参数(pa)返回值为sz字符串中第一个找到的字符的地址。如果没找到,则为pa为0。实现代码如下:void f转载 2020-08-30 15:44:42 · 458 阅读 · 0 评论 -
C语言volatile和restrict关键字
volatile和restrict关键字是C语言中一对功能相反的关键字,volatile是禁止编译器优化修饰的变量,restrict是只能使用该关键字优化的指针变量。volatile关键字由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化,编译器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所有这些都要求使用volatile变量。不懂得volatile内容将会带来灾难。比如:.转载 2020-08-30 15:02:51 · 366 阅读 · 0 评论 -
【转载】C语言之结构体基础知识
转载自https://blog.csdn.net/yanggangclcsdn/article/details/49718131(C语言中的结构体(struct))这篇文章写的还是不错的,条理清晰,唯一不足是对结构体与指针方面介绍的不足===============================================================================================C语言中,结构体类型属于一种构造类型(其他的构造类型还有:数组类型,联合类转载 2020-08-09 22:06:54 · 190 阅读 · 0 评论 -
C语言指针和字符串详解
字符串可以分配在内存的不同区域,通常用指针来支持字符串操作,指针支持动态分配字符串和将字符串作为参数传递给函数。知道字符串的位置对理解程序的工作原理以及用指针访问字符串有帮助。字符串的位置决定它能存多久,以及程序的哪些部分可以访问它。比如说,分配在全局内存的额字符串会一直存在,可以被多个函数访问。静态局部字符串也一直存在,不过只有定义他们的函数才能访问,分配在堆上的内存在释放之前会一直存在,也可以被多个函数访问。字符串通常以字符指针的形式传递给函数和从函数返回,可以用字符指针传递给字符串,也可以用字符常原创 2020-08-09 15:10:19 · 721 阅读 · 0 评论 -
指针和数组之指针表示法和数组表示法
数组是能用索引访问的同质元素连续集合,这里的连续是指数组元素在内存中是相邻的,中间不存在空隙,跟链表的不一样,而同质是指元素都是同一种类型。1.指针表示法和数组表示法指针在处理数组时很有用,可以用指针指向已有的数组,也可以从堆上分配内存然后把这块内存当做一个数组使用。数组表示法和指针表示法某种意义上可以互换,程序使用上可以相互转换,方便理解程序,一般数组下标形式方便看懂程序。int vector[5] = {1,2,3,4,5};int * pv = vector; //vector=&am原创 2020-08-02 21:06:24 · 8064 阅读 · 0 评论 -
数组指针在一维数组和二维数组中应用
数组指针:指向数组整个元素的指针,不是指向数组首元素的地址的,但指针的值等于数组首元素的地址,本质是指针,要仔细理解下。指针的数组:是一个数组,什么样的数组呢?装着指针的数组。然后,需要明确一个优先级顺序:()>[]>*,所以:(*p)[n]:根据优先级,先看括号内,则p是一个指针,这个指针指向一个一维数组,数组长度为n,这是“数组的指针”,即数组指针;*p[n]:根据优先级,先看[],则p是一个数组,再结合*,这个数组的元素是指针类型,共n个元素,这是“指针的数组”,即指针数组原创 2020-08-02 17:30:19 · 800 阅读 · 0 评论 -
指针基础知识讲解
指针是C语言中广泛使用的一种数据类型,是C语言的灵魂。指针提供了动态操控内存的机制,强化了对数据结构的支持,而且实现了访问硬件的功能。学习指针是学习C语言中最重要的一环,能否正确理解和使用指针是我们是否掌握C语言的一个标志。一、指针的概念在计算机中,所有的数据都是存放在内存中的,一般把内存中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不一样,如int占用4个字 节,char占用1个字节。为了正确地访问内存单元,必须为每个内存单元编上号。每个内存单元的编号是唯一的,根据编号可以...转载 2020-07-19 16:55:20 · 1151 阅读 · 0 评论 -
指针与函数
指针对函数的功能有巨大的贡献,指针能够将数据传递给函数,并且允许函数对数据进行修改。指针对于函数的作用主要有两方面:将指针传递给函数和声明函数指针。一、程序的栈和堆程序的栈和堆是C语言程序运行的运行时元素。1、程序栈程序栈是支持函数执行的内存区域,通常和堆共享一块内存区域,通常程序栈占据内存区域的下部,堆用内存区域的上部。程序栈存放栈帧,栈帧存放函数参数和局部变量。调用函数时,函数的栈帧被推倒栈上,栈向上长出一个栈帧,当函数终止时,函数的栈帧从程序栈上弹出,栈帧所使用的内存不会被清理,...转载 2020-07-19 16:51:06 · 301 阅读 · 0 评论 -
静态库函数和动态库函数简单介绍
一、静态链接库静态链接库是obj文件的一个集合,通常静态链接库以".a"为后缀,名字格式一般为libxxx.a,由程序ar生成。静态链接库是在程序编译过程中链接的,已经将调用的相关函数拷贝到程序内部,程序运行时和静态链接库已经没有任何关系。1、静态链接库的创建A、编写源码库文件源码库文件一般包含.c和.h文件,hello.c文件:#include <stdio.h>void display(void){printf("hello world\n")...转载 2020-07-19 15:43:28 · 605 阅读 · 0 评论 -
【转载】c语言位域基础知识讲解
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。在结构体定义时,我们可以指定某个成员.转载 2020-07-12 22:56:31 · 462 阅读 · 0 评论 -
C语言结构体大小与字节对齐关系
1. 什么是字节对齐?在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然边界(alignment)分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。为了使CPU能够对变量进行快速的访问,变量的起始地址应该具有某些特性,即所谓的”对齐”. 比如4字节的int型,其起始地址应该位于4字节的边界上,...转载 2020-07-12 16:13:01 · 764 阅读 · 0 评论 -
C语言指针值传递和地址传递
C语言传参分为值传传递和地址传递。C语言指针传参时,可以通过指针引用方式改变指针指向的值。改变变量,可以使用指针应用方式,改变地址,使用指针的指针引用方式。C语言值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参) #include <stdio.h> void swap(int x, int y); main() { int a = 10, b = 20; swap(a,转载 2020-07-05 21:08:32 · 16100 阅读 · 6 评论 -
C语言内存字节对齐
首先说说为什么要对齐。为了提高效率,计算机从内存中取数据是按照一个固定长度的。以32位机为例,它每次取32个位,也就是4个字节(每字节8个位,计算机基础知识,别说不知道)。字节对齐有什么好处?以int型数据为例,如果它在内存中存放的位置按4字节对齐,也就是说1个int的数据全部落在计算机一次取数的区间内,那么只需要取一次就可以了。如图a-1。如果不对齐,很不巧,这个int数据刚好跨越了取数的边...转载 2020-05-05 15:09:40 · 170 阅读 · 0 评论 -
if(P)和if(!P)含义
在指针使用中,有时候会出现直接判断指针的情况,容易给人带来困惑对int * P ;if(P)的含义:指针判断都要跟NULL比较,相当于0,假值,其余都是真值if(P)就是if(P != NULL ), 不为空执行语句if(!P)就是if(P == NULL ), 为空执行语句...原创 2020-05-03 16:24:11 · 18494 阅读 · 2 评论 -
循环内的switch中break和continue使用区别
首先看下break和continue的使用方法。break语句在循环和switch语句中使用,用于终止最近的封闭代码块,如果在嵌套循环中,则只终止最近的循环。continue语句在循环中使用,不能单独在switch中使用,可以在循环内的switch中使用,用于跳过当次大循环,直接进入下一次循环。 再看下两者在循环内的switch中使用的区别。1、看一个循环内的switch中使...转载 2020-05-02 22:51:47 · 891 阅读 · 0 评论 -
求结构体成员变量的偏移值和结构体的首地址宏
求结构体成员变量的偏移值。1.由结构体指针进而访问各元素的原理a) 通过结构体整体变量来访问其中各个元素,本质是通过指针方式来访问的,形式上是通过.的方式来访问的(这个时候其实是编译器帮助我们自动计算了偏移量)b)offset宏:#define offset(TYPE, MEMBER) ((size_t)&((TYPE*)0)->MEMBER)(1) offse...原创 2020-05-02 22:45:09 · 750 阅读 · 0 评论 -
存储类型、作用域、生命周期、链接属性
一、存储类型C语言中,每个变量和函数都有两个属性:数据类型和数据的存储类型。变量的存储类型是指存储变量值的内存类型。变量的存储类型决定变量何时创建、何时销毁以及它的值将保持多久。计算机中有三个地方可以用于存储变量:普通内存,运行时堆和栈,硬件寄存器。变量的存储类型取决于声明变量的位置。C语言存储类别说明符: 说明符 用法...转载 2020-05-02 21:11:53 · 357 阅读 · 0 评论 -
位运算的使用
嵌入式linux C语言(一)——位运算的使用ARM是内存与IO统一编址,SoC中有很多控制寄存器,通过对这些寄存器进行位运算对这些控制寄存器进行设置,进而控制外设功能。在修改寄存器某些位的过程中不能修改其他的位。一、位运算基础C语言基本的位操作符有与、或、异或、取反、左移、右移六种位运算符。如下表所示: 符号 描述 ...转载 2020-05-02 20:51:44 · 562 阅读 · 0 评论 -
C语言条件编译
预处理命令预处理命令的作用就是在编译和链接之前,对源文件进行一些文本方面的操作,比如文本替换、文件包含、删除部分代码等,这个过程叫做预处理。具体使用时,可以在代码里随便加个陌生符号,根据代码是否可以编过,判断某个条件编译语句是否执行到,用于判断代码里调用哪个接口函数。值得注意的是,条件编译是在编译阶段,判断程序的执行关系,而不是陈谷运行起来以后,通过打印或者GDB来看程序的执行关系...转载 2020-05-02 20:35:07 · 7815 阅读 · 0 评论 -
[转载]sizeof用法
sizeof1.定义sizeof是一个操作符(operator),其作用是返回一个对象或类型所占的内存字节数。这里要说明的是sizeof获取的是数据在内存中被分配的大小,单位是字节数,跟strlen完全不一样的2.语法sizeof有三种语法形式:1)sizeof (object);//sizeof (对象)2)sizeof obje...转载 2020-05-02 01:44:28 · 177 阅读 · 0 评论 -
enum总结
enumenum是C语言中的一个关键字,enum叫枚举数据类型,枚举最简单的理解是有限个const常量的集合,枚举型是预处理指令#define的替代,枚举和宏其实非常类似,宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值,我们可以将枚举理解为编译阶段的宏,使用格式:enum typeName{ valueName1, valueName2, valueName3...转载 2020-05-02 01:47:34 · 5099 阅读 · 0 评论 -
C语言数据类型及在在程序中的作用
一 C 语言包含的数据类型short、int、long、char、float、double 这六个关键字代表C 语言里的六种基本数据类型。在不同的系统上,这些类型占据的字节长度是不同的:在32 位的系统上short 占据的内存大小是2 个byte;int占据的内存大小是4 个byte;long占据的内存大小是4 个byte;float占据的内存大小是4 个byte;do...原创 2020-05-02 01:18:47 · 1705 阅读 · 1 评论