![](https://img-blog.csdnimg.cn/dceff0b07ca54a0585257ccaed2c6034.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
c高级
文章平均质量分 71
讲述不一样的c语言,c语言那些不为人知的背后故事
胡代洲
埋头拉车,抬头看路
展开
-
C语言之补漏专题
sizeof的执行阶段sizeof 是编译时计算,不是执行过程中计算。单引号与双引号单引号(‘’):被单引号的字符为一个变量,以ASCLL形式存储,占一个字节。双引号(“”):表示为字符串,char型,存储长度为字符串长度+1,编译器会在末尾加/0\n \r换行符windows下换行实际上是 \n \rlinux下换行实际上是 \n两系统的换行上解析不同,所以文件在交互使用时有问...原创 2021-11-18 08:58:16 · 92 阅读 · 0 评论 -
c高级学习总结
前言 从2021/4/16日开始学习c高级,5月16日结束,刚好1个月,这个月每天下班后和周末,都在坚持学习,前段时间因工作需要到外地出差,出差期间也没停止我的学习,每个章节我有自己的笔记,本文就是学完后一个总结,一是怕之前学的东西忘记,再回忆一遍加深记忆,另外也算是为这一个月的学习画上一个句号,说实话学完后心里感觉空唠唠的,不静下心来细想,好像不知道到底学到了什么,写这篇总结的另外一个目的就是,细数这个月的过往,以求心安。之前看课程简介时印象最深刻的是说很多同学学习完c...原创 2021-11-17 19:52:18 · 326 阅读 · 0 评论 -
c语言之位域
什么是位域有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有 0 和 1 两种状态,用 1 位二进位即可。为了节省存储空间,并使处理简便,C 语言又提供了一种数据结构,称为"位域"或"位段"。所谓"位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。典型的实例用 1 位二进...原创 2021-11-17 19:39:56 · 218 阅读 · 0 评论 -
c语言之链表
为什么会有链表数组有2个缺陷,1.数组的元素类型必须相同,2.数组的大小不能中途改变,结构体解决第1个缺陷,链表则是解决两个缺陷。什么是链表链表由指针和有效数据构成,指针用来指向前一个或后一个数据,最后一个指向自己或null; 每一给节点是一个结构体,结构体内有2种类型元素,结构体类型指针和有效数据类型。 链表使用堆内存,方便节点的添加和删除; 头指针:是一个普通类型的结构体指针,指向链表的第一个节点。链表的操作链表创建步骤申请1个节点所需大小的堆内存。 清理申...原创 2021-11-17 19:36:59 · 588 阅读 · 0 评论 -
c语言之存储类&作用域
内存各分区数据类型 序号 内存分区 数据类型 说明 代码段 可执行程序 文本段(.text) 只读数据段 const常量 不同平台不同,下载程序时写入数据 数据段 非0全局常量 非0局部原创 2021-11-17 19:34:58 · 117 阅读 · 0 评论 -
c语言之动静态链接库
静态链接库.a出于版权保护行为,将源文件编译但不链接生成.o文件,再用ar工具将多个.o文件归档成.a文件,该.a文件就被称为静态链接库。再发布.a和.h文件,h文件显示有.o中函数声明。用户即可知道库内有什么函数。用户使用的时候编译链接主函数时会来链接.a中相关功能函数,生成一个可执行文件。由于添加了库函数代码,最终用户可的执行程序较大。动态链接库.so动态链接库的后缀名是 .so(对应Windows中的.dll);编译时动态链接库的方式则不把库文件中的功能函数...原创 2021-11-17 19:30:30 · 914 阅读 · 0 评论 -
c语言之函数
函数的忌讳函数被频繁调用,避开栈的重复申请,将其修饰为inline内联函数。 函数传参不宜太多,≤4个,要过多时考虑结构体。 尽量不碰全局变量,提高函数的模块化,可移植性,尽量使用传参。 函数调用,就是函数指针的解引用。inline内联函数内联函数是函数,主要是为了减少处理器的开销,普通函数调用时需要进行压栈和弹栈,而内联函数则不需要,编译器会像对待宏定义一样,直接将函数内的表达式拷贝并插入到调用函数的地方(说白了就是利用空间来换取效率),与宏不同的是,宏是在预处理的时候进行...原创 2021-11-17 19:26:15 · 49 阅读 · 0 评论 -
宏定义预处理
c程序编译过程源码.C->预处理(.c)->编译(.S)->汇编(.O)->链接(.elf可执行文件);预处理是在编译前做的第一步工作;规则:预处理阶段,原封不动的替换。多级宏定义时递归替换,直到内容不是宏;预处理不报错,由程序员自己把握;gcc功能指定gcc xx.c -o //指定编译后的目标文件名称;gcc xx.c -c //只编译不链接;gcc -E xx.c //只预...原创 2021-11-17 19:22:03 · 274 阅读 · 0 评论 -
大小端 & 枚举
大端模式大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。小端模式小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。小端模式用得居多。大小端模式测试可用union测试大小端模式: 用指针测...原创 2021-11-17 19:17:24 · 108 阅读 · 0 评论 -
c语言之内存对齐
概述对齐访问就是当我们定义了一个2字节的变量,编译器可能会给我们分配4个字节,另外2个字节被闲置。对齐访问与非对齐访问是编译器对效率与资源权衡后的结果。非对齐访问物理内存是支持的,但是效率低,对齐访问效率高,所以编译器会使用对齐访问。非对齐访问过程第一步:读涉及内存的第一个字节,第二步:读涉及内存的第二个字节;第三步:清除第一字节的无关位,第四部:清除清除第二字节的无关位,第5步:将第...原创 2021-11-17 19:14:06 · 1324 阅读 · 0 评论 -
字符串之与众不同
字符串的与众不同c语言本身没有字符串变量,是通过指针将字符组合实现。字符串在内存中其实就是多个内存连接在一起(类似于字符数组cha tble[x ] );指针指向头,\0固定尾部,连续一段内存。\0 的ASCLL是0。每个字符占一个字节,char型,8位。字符串的冒号含义示例:char *p = “linux”定义一个指针,并给出了初值,这种情况实际上双引号背后为我们做了3件事情:在末尾添加 \0; 申请内存...原创 2021-11-14 14:37:07 · 91 阅读 · 0 评论 -
内存布局之堆栈
栈局部变量是放在栈中的,操作系统会给每一个进程分配1个固定大小的栈,到底多大不同操作系统分配不同,栈使用简单,不需要申请、释放内存,全是自动完成。进入函数定义局部变量时,系统自动为其分配一个空间,退出函数时就系统就自动回收。但是没有清零。下次其它函数定义变量时,又对上次的空间进行分配。栈的特点:自动管理、重复使用、空间有限。所以使用栈时要注意如下问题。定义局部变量时需要进行初始化。 局部变量的地址不能进行返回或传送,让别人来访问。 局部变量不能定义太大,会溢出。堆...原创 2021-11-14 14:31:50 · 584 阅读 · 0 评论 -
C高级指针
数组指针&指针数组数组指针:int (*p)[5];指向数组的指针;指针数组 int *p[5] 集合指针的数组;数组与指针的确认找核心,int *p[5]或int (*p)[5]核心始终是p; 找结合,谁与核心近就和谁先结合,都近则找优先级(“[ ]”、“->”、“.”很高); 由内向外逐层剥离,把结合的看成一个整体,在与下一个结合;示例1:int *p[5]、int (*P)[5]、int * (p[5]);...原创 2021-11-14 14:28:00 · 311 阅读 · 0 评论 -
指针的背后
为什么有指针汇编中,CPU访问外部内存必须使用汇编中的间接寻址,c语言要访问内存,因此也必须要能实现间接访问,所以有了指针。左值、右值放在“=”左边的叫左值,右边的是右值;左值变量,编译器认为是变量在内存的空间(格子);a=1;将1放入a的格子里;右值变量,编译器认为是内存(格子)里的数;a=b,将b的内容放入a的格子里;指针与变量指针的实质还是变量,全称指针变量;指向任何类型的指...原创 2021-11-14 14:12:08 · 233 阅读 · 0 评论 -
深入学习数组
数组也是变量变量本质是一个地址,变量名是与地址绑定的一个标号,变量类型是占用内存字节长度。数组也是变量,只是长度不一样。数组中左右值含义数组int a[10]会出现的情况有a、a[0]、&a、&a[0]a[0]:做左值,代表第0个元素格子;做右值,代表首元素的地址的内容。 a:做左值,代表a整个数组空间,不能直接被赋值;做右值代表数组的首元素的地址,等效于 &a[0]; &a:禁止左值,&a是一个常量(地址数),做右值,代表整个数组...原创 2021-11-14 14:07:06 · 519 阅读 · 0 评论 -
c语言位操作
~ 和 !按位取反“~”,逻辑反“!”一个数(非0),取两次逻辑反!就会变成1;位异或位异或“^”,两个数相同(1或0),结果为0;不同结果为1;记忆方法:相异就或起来。左右移无符号数左移、右移都补0特定位写1x | 1<<X#define SET_BIT_N(x,n) (x | (1U<<(n-1)))//U代表1为无符号特定位写0x & ~(1<<x)#define REST_BIT_N(x,n) (x &am...原创 2021-11-14 11:58:18 · 64 阅读 · 0 评论 -
c基础补充
c与内存内存是用来存储程序的可变数据的。操作系统把内存分成页为单位管理,并给用户提供API接口,申请malloc,释放free。哈佛结构:程序和数据分开存放,如单片机,程序在ROM,数据在RAM;冯诺依曼结构:程序和数据存放在一起,如PC机;动态内存(需要初始化):动态内存则是在程序运行中进行分配的,如局部变量,动态内存在堆中。静态内存(无需初始化):是程序在编译时分配给变量的空间,变量从...原创 2021-11-14 11:54:43 · 60 阅读 · 0 评论