C语言
文章平均质量分 69
C语言部分的一些个人笔记
贩卖纯净水.
圣火昭昭,圣光耀耀,凡我子弟,喵喵喵喵
展开
-
C/C++程序内存划分及程序执行
栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限,栈区主要存放运行函数而分配的局部变量,:一般是由程序员分配释放(动态内存开辟函数malloc,calloc等),若程序员不释放,程序结束时可能由OS(操作系统)回收,分配方式类似链表。调用函数是为了实现一系列功能,而实现这一系列功能本质是指令,函数的地址是这一堆指令中第一个指令的地址(类似于数组地址为首元素地址)声明(承诺)获取不到函数的地址(一具空壳),在定义(兑现)中才能获取到函数的地址。:在执行函数的时候,函数内部的。原创 2024-02-29 23:14:13 · 352 阅读 · 2 评论 -
strlen函数的实现
我们知道,strlen函数是一个用于计算字符串中字符大小的库函数,那么今天我们就来用三种方法模拟实现strlen函数首先,我们来了解一下strlen函数的细节知识:看不懂洋文?没关系我们一起拍照翻译这段文字简单介绍了strlen函数的功能和测试用例,函数实现其实主要看参数与返回类型也就是这一行:该函数返回类型为size_t(毕竟计算字符个数嘛怎么可能出现负数)参数类型为const char*根据这点可以把函数的框架先写出来下面就可以来模拟实现啦。原创 2024-01-26 22:14:03 · 402 阅读 · 3 评论 -
数据在内存中的存储
整数的二进制表示方式有三种:原码,反码,补码,三种方法均有符号位(0:正,1:负)和数值位,最高位为符号位,其余都为数值位,正数的原码,反码,补码相同。因为在计算机系统中,以字节为单位,每个地址单元对应着一个字节,一个字节占8个bit位,在C语言中有8bit的char,16bit的short,32bit的int,对于位数>8的处理器(16位、32位)由于寄存器宽度>1byte,必然存在一个如何将多个字节安排的问题,这就推动了大小端存储模式的形成。小端模式的优点:强制类型转化,可以直接取出前面的低位两字节。原创 2024-01-27 00:51:57 · 1013 阅读 · 3 评论 -
内存函数们的使用和实现
但是我们发现有时标准库中的memcpy也能实现重叠拷贝,但这不代表所有编译器实现的标准库中的memcpy都能实现重叠拷贝,总结起来就是:VS牛波一!memcpy是做内存拷贝的,拷贝的可能是字符串,可能是整形数组,可能是结构体也可能是其他类型。memset的设置1,是把内存中的每个字节都设置为1,memset以字节为单位设置内存值。memcpy函数只要能处理内存不重叠的拷贝就行,可以将重叠的情况交给memmove函数。其实,随着拷贝的进行,3位变成1,4位变成2,在拷贝的时候也为1,2。原创 2024-01-26 22:09:42 · 279 阅读 · 3 评论 -
qsort函数的使用及实现
把函数指针作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数,回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应,把调用的函数的地址以参数形式传递回去,使用函数指针接收,函数指针指向什么函数就调用什么函数。qsort函数用来排序,但是数据的比较需额外操作,故将排序函数和比较函数分开实现,使用冒泡排序来实现一个对任意类型能够排序的函数,compare指针指向的函数的参数是:要比较的两个元素的地址。原创 2024-01-26 22:10:26 · 372 阅读 · 16 评论 -
sizeof和strlen的使用及差异
sizeof。真是好提取,这个简介好简介原创 2024-03-26 22:12:36 · 701 阅读 · 2 评论 -
指针、数组、函数的相爱相杀
所以当str1,str2数组比较时,比较的时数组首元素的地址,由于是两块空间,所以数组首地址不同,而str3,str4为指针变量,指向常量字符串“abcdef”,由于是常量字符串(可看做数组),内容不可被更改,所以不用保存两次,只需向内存申请一块空间,str3,str4指向的地址相等。数组名为数组首元素的地址(当数组名单独放在sizeof内部和&数组名时数组名为整个数组)名表其意,函数指针也是一种指针,指向函数,存放的是函数的地址。名表其意,数组指针是指向数组的指针,存放的是数组的地址。原创 2024-01-27 00:54:02 · 234 阅读 · 2 评论 -
区区文件操作
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据或输出内容的文件。每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并去填充其中的信息,使用者不必关心细节,一般都是通过一个FILE的指针来维护这个FILE结构的变量。每个被使用的文件都在内存中开辟了一个相应的文件信息区,用于存放文件的相关信息(如文件的名字、文件状态及文件当前的位置等)这些信息是保存在一个结构体变量中的,该结构体类型是由系统声明的,取名FILE。硬盘(磁盘)上的文件是文件。原创 2024-03-25 19:01:38 · 670 阅读 · 7 评论 -
动态内存分配
数组一旦创建好,就无法更改了,那么我们怎么样能做到将数组大小灵活调整呢?(^-^):用变长数组!!变长数组:数组的大小可以用变量指定,但数组创建好后,依然不能调整大小,申请的空间不能灵活调整。想要申请的空间灵活调整,就要学习动态内存开辟的相关知识进行动态内存分配的原因:1.原来内存空间开辟大小是固定的。原创 2024-01-26 22:06:45 · 798 阅读 · 3 评论 -
字符串函数们的使用和模拟实现
字符串拷贝函数。原创 2024-01-26 22:08:46 · 795 阅读 · 3 评论 -
typedef
答案:这是对signal函数的声明,函数有两个参数,第一个参数为int类型,第二个参数为函数指针类型,该函数指针指向的函数参数是int类型,返回类型为void,signal函数的返回类型是一个函数指针,该函数指针指向的函数参数是int,返回类型是void。),但没必要,可读性太差了!但是,一旦使用这个:typedef,代码的可读性就会高很多!比如说:在定义类型的时候可以一键替换(当代码量多且杂时很方便)咱就是说,看不懂一点了(代码来源:《C陷阱与缺陷》)魔法还在继续,typedef在另外的地方也有妙用。原创 2024-01-27 00:53:31 · 315 阅读 · 2 评论 -
疯狂の野指针
有鱼焉,其名为鲲,有狗焉,其名为野指针;野指针就像一条没有被约束的疯狗,容易在程序中乱搞发生问题野指针有三条成因:1、指针指向的范围超出数组的范围(越界访问)2、指针未初始化3、指针指向的空间释放针对问题规避野指针。原创 2024-01-27 00:56:12 · 220 阅读 · 3 评论 -
assert断言
assert.h头文件定义了宏assert(),用于在运行时确保程序符合指定条件,如果不符合,就报错终止运行,这个宏常常被称为断言。原创 2024-01-27 00:53:12 · 331 阅读 · 5 评论 -
活泼の枚举
5.枚举常量是遵循作用域规则的,枚举类型声明在函数内,只能在函数内使用。一般枚举常量都大写,这些可能取值都是有值的,默认从0开始,依次递增1。2.和#define定义的标识符比较,枚举类型有类型检查,更加严谨。我们明明可以使用#define定义常量,为什么还要使用枚举呢?enum:枚举类型,{}中是枚举类型的可能取值-->枚举常量。3.便于调试,预处理阶段会删除#define定义的符号。C++中不可以(cpp类型检查比较严格)4.使用方便,一次性可以定义多个常量。可以用整数给枚举变量赋值吗?原创 2024-01-27 00:54:46 · 180 阅读 · 3 评论 -
抓住一只联合体
与结构体一样,联合体也由一个或多个成员构成,这些成员可以是不同类型,但编译器只为最大的成员分配足够的内存空间,联合体的特点是所有成员共用一块内存空间,所以联合体也叫共用体。成员 成员对齐数 默认对齐数 对齐数。2.当最大成员不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍。联合体的成员共用一块空间,给一个成员赋值,其他成员的值也跟着变化。1.联合的大小至少是最大成员的大小。至少为14,为4的倍数:16。至少为5,是4的倍数:8。原创 2024-01-27 00:54:28 · 311 阅读 · 2 评论 -
热情の位段
注意事项:位段的几个成员共有同一个字节,这样有些成员的起始位置并不是某个字节的起始位置,那么这些位置是没有地址的(内存中每个字节分配一个地址,一个字节内部的bit位是没有地址的),所以不能对位段成员使用&操作符,这样就不能使用scnaf直接给位段的成员输入值,只能先输入放在一个变量中,然后赋值给位段的成员。4.当一个结构包含两个位段,第二个位段成员比较大,无法容纳第一个位段,剩余的位时,是舍弃剩余的位还是继续使用是不确定的。2.位段的空间是按需以四个字节(int)或者一个字节(char)的方式来开辟的。原创 2024-01-27 00:55:29 · 360 阅读 · 7 评论 -
冷酷の结构体
假设一个处理器总是从内存中取8个字节,地址必须是8的倍数,如果我们能让所有double类型的数据的地址都对齐8的倍数,那么就可以用一个内存操作来读写值了。传值调用更好:传地址大小最多八个字节,形参是实参的一份临时拷贝,函数传参时,参数是需要压栈,会有时间和空间上的系统开销,如果传递一个结构体对象,结构体过大,参数压栈系统的开销比较大,会导致程序性能的下降。4.如果出现嵌套结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套的结构体成员)的整数倍。原创 2024-01-27 00:55:43 · 756 阅读 · 7 评论 -
开朗の循环
for(exp1;exp2;exp3)//初始化 判断 调整语句;注:exp:表达式。原创 2024-01-27 00:53:45 · 378 阅读 · 2 评论 -
兔子数列两种实现
递归即函数自己调用自己,当递归调用时,会开辟属于自己的栈帧空间,直到开始回归才逐层释放栈帧空间,递归层次太深会浪费太多栈帧空间,可能导致栈溢出 ,而且递归层次越深,冗杂计算越多,所以这种方法实现斐波那契数列不是最优解,还可以使用更好的方法:迭代。兔子数列的实现方式有两种:递归、迭代。兔子数列(斐波那契数列)原创 2024-01-27 00:52:49 · 240 阅读 · 5 评论 -
goto语句
goto语句可实现在同一函数内跳转到设置好的标号处使用得当可以在多层循环的代码中快速跳出(当多层嵌套循环存在时,break只能跳出一层循环,goto可跳出多层循环)使用不当会导致瞎跳的情况。原创 2024-01-27 00:56:30 · 110 阅读 · 4 评论