C语言
文章平均质量分 86
循序渐进,稳步提升
zyx没烦恼
每天都要让自己变的更强
展开
-
常见的字符串函数(包含头文件string.h)和字符函数(2)
为什么不使用(char*)src++,(char*)det++这种写法,因为这种写法有点问题,有些编译器是不支持这样写的,被(char*)强转了就是一个临时的变量,对一个临时的变量进行操作是有问题的。上面说了,memcpy用于单独的两个空间(重叠的内存也能实现,但是C中规定它只能用于单独的两个空间),那重叠内存的拷贝应该用什么函数 - > memmove。由上图知:第三第四元素地址被第一第二元素地址覆盖了,后面拿第三第四元素内容和第一第二元素一样,后面的地址跟前面的同理,就会出现如图这样的结果。原创 2024-06-27 22:58:30 · 1029 阅读 · 1 评论 -
柔性数组(flexible array)
柔性数组从C99开始支持使用不包括柔性数组的内存由图可知sizeof计算时不会包含柔性数组的大小如果结构体中有柔性数组,那么系统应该这么帮结构体开辟空间。原创 2024-06-28 22:50:33 · 393 阅读 · 0 评论 -
文件操作详解(C语言)
我们将数据冲数据区输出/输入到磁盘(文件)的时候不是直接输入/输出过去而是先经过缓冲区,通过缓冲区进入磁盘的,但是我们放到缓冲区的数据不会直接进入到磁盘,要怎么才能将数据放到磁盘了。我们将数据传给输出设备如果这些设备的读写的都不相同,程序要使用的话都需要了解,那对一个程序来说太复杂了,所以为了解决这个问题C语言引入了流(stream)文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。.c源程序文件 / .obj目标文件 / .exe执行文件,原创 2024-07-02 15:07:04 · 924 阅读 · 0 评论 -
结构体内存的对齐规则(重点)
计算时将int a[5]看成5个int a //对齐数为4 ,int a[5]是一个连续的空间。运行程序之后可以观察到这两个结构体内存大小竟然不一样,那我们应该如何计算结构体内存大小呢?结构体的总大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。,linux,gcc没有对齐数,对齐数就是成员自身大小。嵌套的结构体对齐到自己的最大对齐数的整数倍处。对齐数:结构体自身大小和默认对齐数的较小值。结构体在计算其大小的时候有一定的对其规则。没对齐之前:访问i的空间需要访问2次。对齐之后:访问i只需要访问一次。原创 2024-06-23 23:59:15 · 622 阅读 · 0 评论 -
C语言·动态内存管理
1.str传给p值的时候,p是str的一份临时拷贝,有自己独立的空间GetMemory在向系统申请空间之之后,放入了p中,在GetMemory返回之后,str的值依旧是NULL,即在strcpy拷贝时,形参非法范问了空间。后边没有足够大的空间可以扩容时,realloc函数会找一个满足空间大小的新的连续的空间,把旧的空间的数据拷贝到新空间的前面的位置,并且把旧的空间释放掉,同时返回新的空间的地址。后边有足够大的空间可以扩容时,realloc会直接在原有的基础上向后续上新的空间,返回旧的初始地址。原创 2024-06-21 21:04:59 · 1150 阅读 · 0 评论 -
自定义类型:结构体,枚举,联合
如何定义和初始化呢?->1.声明结构体的同时定义结构体变量s1//姓名int age;//年龄//性别}s1;->2.声明结构体的同时定义结构体变量s1以及初始化//姓名int age;//年龄//性别}s1 = {"zyx", 20, "男"};->3.定义结构体变量->4.定义变量的同时初始化struct stu2struct stu1 s3 = {"zyx", 20, "男"};->5. 结构体嵌套结构体int age;}p1 = {20, {"zyx", 20, "男"},};原创 2024-06-18 20:18:31 · 1429 阅读 · 0 评论 -
通讯录管理系统(C语言版:源码+详解)
test.c。原创 2024-06-15 18:38:29 · 511 阅读 · 1 评论 -
常见的字符串函数(包含头文件string.h)和字符函数(1)
因为strlen测量字符串是到'\0'结束,由于字符串中没有结束符'\0',strlen找不到结束计算的标志,就会一直向后寻找结束符'\0',直到找到'\0'为止,在此期间的所以我们不知道strlen函数遇到了多少字符,所以arr数组的长度是不可预知的,即arr的数组的长度是一个随机值。strcpy函数拷贝到'\0'结束,它会将‘\0’之前的字符拷贝到name中包括'\0',用strcpy时,原数据需要'\0',不然没法停止。可以看到strcpy函数拷贝字符串时源字符串中的'\0'也会被拷贝进目标空间。原创 2024-06-12 22:05:52 · 1125 阅读 · 0 评论 -
C语言指针(详解版)进阶部分
p1 == p2:为什么p1等于p2,"abcdef"是常量字符串谁也改不了,系统就将这个字符串放在只读数据区,谁需要用直接在里面拿出来用就好了,所以p1的地址等于p2的地址。int (*p1)[10] p是数组指针,去掉变量名就是它的类型:int (*)[10]。*p为指针数组的数组名,即首元素地址,对*p进行加i操作就是改变*p的指向,遍历数组。*(a+i)和a[i], parr[i][j]和*(parr[i]+j)原理相同。//类型:int(*)[10]原创 2024-06-06 12:15:28 · 1149 阅读 · 0 评论 -
C语言指针(函数指针的深入)
如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。但是上式并不能生效,因为运算符*的操作数必须是一个指针,不仅如此这个指针还得是一个函数指针,这样经过运算符*作用后的结果才能作为函数被调用。回头再掉函数,你把你的函数指针通过传参的形式传递给某个函数,该函数再调用它自身之后再调用你传递的函数。这个声明的含义是:当对表达式求值时,((f))的类型为浮点型,由此可以推知,f也是一个浮点类型。所以上述代码的作用是调用0地址处的函数,一次函数调用。原创 2024-06-07 19:34:28 · 774 阅读 · 0 评论 -
冒泡排序(C语言)
>第1次遍历,两个相邻的数比较大小,若左边的数大于右边的数,则两个元素交换位置,反之,继续向后比较,当第1次遍历结束之后该组元素最大的数就被移动到了末尾。->第2次遍历,除去第一次的最大数,将这组数据中最大的数放至末尾。C语言给我们提供了一个库函数,可以排序任意类型的数据 qsort。->3.待排列数据元素的大小(一个元素,单位:字节)->根据以上原理,直至将这组元素排至升序,循环结束。知道了qsort函数的参数之后,我们现在来使用一下。->1.你要排序的数据的起始位置。->2.待排列数据元素的个数。原创 2024-06-10 20:54:20 · 600 阅读 · 2 评论 -
操作符优先级表格(详解版)
求变量的长度,单位字节以数据类型为准,不计算内部表达式表达式1?表达式2: 表达式3原创 2024-05-22 20:14:48 · 525 阅读 · 1 评论 -
不同数据在存储中的储存方式(下半部分)
num和*pfloat在内存中明明是同一个数,为什么浮点数和整数的解读结果会差别这么大根据国际标准IEEE(电气电子工程师学会)745,任意一个二进制浮点数v可以表示成下面的形式:(-1)^S表示符号位,当S = 0时,v为正数;当S = -1时,v为负数M表示有效数字,大于等于1,小于2(1 1.01*2^2(M的小数点往左移动了两位)原创 2024-05-17 21:03:52 · 880 阅读 · 0 评论 -
不同数据在存储中的存储方式(上半部分)
c语言提供的一些基本的内置类型类型 开辟内存空间的大小(字节)char (字符型) 1short(短整型) 2int (整型) 4long (长整型) 32位/64位 4/8long long (更长的整型) 8float (单精度浮点型) 4double (双精度浮点型 8浮点型家族:只要表示小数就可以用浮点型float的精度低,储存的数值范围小(精确到后六位)double的精度高,储存数值范围大 (精确到后十五位)数组类型 int a[5] //根据需求可以创建不同的数组。原创 2024-05-14 20:44:39 · 897 阅读 · 1 评论 -
C语言指针(详解版)初阶部分
那一共就是2^32Byte = (2^32Byte/1024)KB = (2^32Byte/1024\1024)MB = (2^32Byte/1024/1024/1024)GB = 4GB。对于32位的机器,假设有32根地址总线,每根线在寻址的时候会产生高电平(高电压)和低电平(低电压)就是1或者0。根据以上分析,在64位的机器上,一个二进制序列要8字节来存储,所以指针\地址大小就为。结论:指针的类型决定了进行加1减1操作时跳过了多少字节,决定了指针的步长。->通过下图可以看到pc,pb的地址是一样的。原创 2024-05-02 08:50:25 · 460 阅读 · 0 评论 -
用递归实现C语言汉诺塔问题
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具,由法国数学家爱德华·卢卡斯于1883年发明。[1]汉诺塔的玩法是将一个木桩上的圆盘转移到另外一个木桩。移动规则:1、一次只能移动一个圆盘;2、每个桩上只有最顶层的圆盘可以移动,并且所移动的圆盘只能移到空木桩上或者它要比木桩顶层已存在的圆盘小。也就是说,你不能将大圆盘置于小圆盘之上。常见的汉诺塔n=6~10,完成转移需要2n-1步。[1]分析问题现在我们假设面前有三根柱子,其中起始柱(start)上有n个圆盘。原创 2024-03-29 20:59:07 · 505 阅读 · 0 评论