
c语言
文章平均质量分 83
c语言的语法介绍
zl_dfq
这个作者很懒,什么都没留下…
展开
-
#define,源文件与头文件,赋值表达式
是预处理阶段(在编译之前)由预处理器处理的。原创 2025-02-02 16:14:24 · 518 阅读 · 0 评论 -
sizeof和strlen的对比,\0与0,数组元素的默认值,函数参数的传递顺序,格式控制说明符,字符串的输入输出,变长数组与gets函数
是一种注意事项:(1)sizeof返回的值类型是size_t,这是一个无符号整数类型格式控制符为: %zu(2)sizeof中的表达式并不会计算如上图:如果计算,c应该等于1才对虽然a、b都是int型,占4个字节但最终是赋值给c,c是short型,只占2个字节所以sizeof计算的是short类型的大小(2.1)不计算的原因:(2.1.1)sizeof在编译时进行计算,而不是在运行时,而不是实际去计算表达式的值。(2.1.2)这种设计避免了运算,可以提高程序的效率。原创 2025-01-31 19:46:41 · 1280 阅读 · 0 评论 -
使用冒泡排序模拟实现qsort函数
当p1指向的内容大于p2时,函数返回 大于0的值。当p1指向的内容小于p2时,函数返回 大于0的值。避免代码冗余,创建一个Swap函数进行数据的交换。被调用的函数就是用来实现任意数据的比较方式的。当cmp函数返回值>0时,才进行后续的操作。当p1指向的内容等于p2时,函数返回 0。qsort函数可以实现任意数据的排序。(1.4)函数传参传进了width,注定了该算法不能实现其他数据的比较。两个元素的第一个字节、元素的大小。(1)我们并不知道元素的类型。(2)此时,传入的参数应该是。原创 2025-01-30 18:00:15 · 1283 阅读 · 0 评论 -
指针的介绍4【回调函数、qsort函数的运用】
I参数因为不知道要传入的是什么类型的指针,所以统一使用 void* 来接收从左往右,要传入的第一个参数是待排序数组的第一个元素的地址第二个参数是元素个数第三个参数是每个元素的大小,单位是字节第四个参数是一个函数指针qsort函数通过这个函数指针调用相关的函数qsort函数要调用的函数是程序员自己写的因为不同的类型有不同的比较方式字符串、结构体的排序不能粗暴的使用< >!= ==进行比较整型、浮点型的排序可以程序员自己写的函数就是实现数据比较方式的函数。原创 2025-01-30 16:01:26 · 870 阅读 · 0 评论 -
指针的介绍3后
即,p 指向了一个 void (*) (int a, int b) 型的函数。函数名为 p ,形参为(int a, int b), 返回值为 void*void(*p)(int a, int b) 如果去掉第一个括号,变为。学习完整型指针变量,字符指针变量,数组指针变量之后,我们不难推出。但注意*p要用()括起来,不然p会先于第二个()结合。(*p)(3, 5)有解引用的书写 便于理解。*p就拿到了函数, *p == test。p(3, 5)无解引用的书写 简化符号。p拿到了函数test的地址。原创 2025-01-29 20:14:38 · 993 阅读 · 0 评论 -
指针的介绍3前
上面的代码中,我创建了arr 来一个此时,我创建一个指针变量对这个字符串进行相应的此时,p指向的是字符串首元素,即字符'a'但值得注意的是:这是一个(1)定义:常量字符串(Constant String)是指存储在程序内存中的一段的字符序列(2)形式:常量字符串通常使用双引号("")括起来,并自动在末尾添加一个空字符('\0')作为字符串的结束标志这是因为,上段代码的语法并未发生错误,只是规则不允许,导致程序崩溃。原创 2025-01-29 15:51:57 · 890 阅读 · 0 评论 -
指针的介绍2后
我们知道,字符数组是一个数组,它里面存放着字符整型数组是一个数组,它里面存放着整型所以指针数组是一个数组,它里面存放着指针当然,二级指针也可以被存放。原创 2025-01-27 15:29:09 · 323 阅读 · 0 评论 -
指针的介绍2前
观察得到,数组名就是数组首元素的地址但有2个例外:1.如果在这段代码中,arr还是数组首元素的地址的话那么打印结果就应该是或但打印结果是注意到数组一共有 9 个的元素数组的大小正好是个字节2.上面的代码示意图如下:&arr[0] 、arr、&arr 拿到的地址相同进行+1操作之后,4指针类型相同&arr 跳过 36 个字节,即跳过了一个数组总结:(1),sizeof中单独放数组名,这⾥的,计算的是整个数组的⼤⼩, 单位是字节(2),这⾥的。原创 2025-01-27 12:29:57 · 1005 阅读 · 0 评论 -
指针的介绍1前
(1)计算机的时候,需要的数据就是的,处理之后的数据又当中(1)被分为一个个每个内存单元都有相应的编号,就像一幢楼不同房间的门牌号不同一样这样的CPU与内存之间就是靠着内存单元编号来找到相应的数据的计算机中常见的单位(2)一个比特位可以存储一个二进制的0或者1(4)相当于生活中的门牌号,也就是某个。所以内存单元编号 == 地址 == 指针。原创 2025-01-26 12:07:58 · 1423 阅读 · 0 评论 -
指针的介绍1后
通过指针加减整数跳过相应的字节就可以访问相应的数组元素等。原创 2025-01-26 12:06:00 · 936 阅读 · 0 评论 -
柔性数组与c/c++程序中内存区域的划分
(1)第一种方法是在堆区开辟一块连续的内存,使用一次malloc和free即可struct Dint a;(2)第二种方法不一定连续,需要使用两次malloc和freestruct Dint a;int *arry;相比之下,方法1具有两个好处:(1)方便内存释放:一次free即可(2)有利于访问速度:连续的内存访问速度更快。原创 2025-01-24 15:33:27 · 806 阅读 · 0 评论 -
分支结构之 switch语句
程序从 “case 10: ” 往后执行,因为没有 break 所以,程序往下执行到“case 9 :”语句 打印出A之后,遇到break 然后退出。default语句的位置与case语句的位置没有固定要求,但是一般的,我们通常是先写case语句,再写default语句。:当传进来的常量不与case后面跟着的常量相匹配时,就执行default语句。因为,一般来说,传进来的常量值,是有一 一对应的case语句。变量被赋值为1,传进圆括号的a就相当于1。显然,a没有被初始化,是彻底的变量,自然无法运行。原创 2024-11-24 20:07:13 · 834 阅读 · 0 评论 -
c语言的选择结构1
1)else是对前面if的否定,就是说当小括号里面的语句为假的时候执行else后花括号里面的语句。上面代码中 2 中的else 与 1 中的if配对, 3中的else 也与 1 中的if配对。2)每一个else都是对前面的if的否定,else总是与在其之前、与其最近的且不与其他else配对的if进行配对。1)小括号里面存放 表达式 , 执行表达式的结果之后进行真假判断(非零为真,零为假)。(个人觉得这句话比较绕,实际书写代码的时候,只需要记得else是对前面判断条件的否定就行)2. if else语句。原创 2024-11-14 11:15:18 · 187 阅读 · 0 评论 -
C语言之动态内存管理
上述内存开辟的特点:(1)(2)显然,当大小被固定的时候,或多或少都存在着空间大小不足或者浪费的情况C语言引入了动态内存开辟,让程序员,就非常灵活了。原创 2025-01-23 19:08:44 · 1409 阅读 · 0 评论 -
移位操作符 与 位操作符
, 叫作按位与位,指的是整数在内存中以补码形式存储时的二进制位|, 叫作按位或位,指的是整数在内存中以补码形式存储时的二进制位^, 叫作按位异或位,指的是整数在内存中以补码形式存储时的二进制位~, 叫作按位取反位,指的是整数在内存中以补码形式存储时的二进制位。原创 2025-01-20 01:45:00 · 1997 阅读 · 0 评论 -
进制转换 与 原码反码补码
了解不同进制,需要了解它各个数位的权重以及数位上数字的范围(1)针对于整数的2进制表示方法,有原码、反码、补码的说法(2)有符号整数的三种表示方法由符号位与数值位两部分组成,最高位的1位为符号位,其余的就是数值位符号位上0表示正数,1表示负数(2)无符号整数没有符号位,只能表示正数和0,由于缺乏符号位,所以不需要区分原码反码补码无符号整数的二进制表示就是其真实的数值表示(3)正整数的原码反码补码相同,负整数各不相同原码。原创 2025-01-12 11:14:45 · 1028 阅读 · 0 评论 -
一维数组的介绍
4)不同类型的数组,单个元素所占的内存空间不一定相同,导致相同内存大小下,数组可存放的最多元素个数不一定相同。,size_t是一种无符号整型类型,该类型用于表示对象的大小或者数组的长度(元素个数)等。比如:我们要存放3个学生的身高信息:187,158,170。4)元素个数大于常量值,是错误初始化,会导致程序运行问题。数组是相同元素的集合,了解到确切的元素个数之后,自然想到。数组算是一种自定义的类型,去掉数组名就是数组的类型。3)元素个数小于常量值,叫做不完全初始化,(3)数组中的元素类型相同,数组中的。原创 2024-12-08 20:22:13 · 880 阅读 · 0 评论 -
文件的介绍3
sprintf:返回写入到缓冲区中的字符串的长度(不包括\0),通常不用于错误处理。printf:返回成功写入的字符总数(不包括终止的空字符),在极少数情况下可能返回负值表示错误。fprintf:返回成功输出的字符数(不包括终止的空字符),在发生错误时返回负值。scanffscanf和sscanf的返回值都表示成功读取并赋值的输入项的数量。返回值为正整数时表示成功读取了相应数量的输入项。返回值为0时表示没有读取到任何数据或输入不匹配。scanf和fscanf在输入流结束时可能返回EOF,而。原创 2024-12-23 17:05:24 · 984 阅读 · 0 评论 -
双重循环的使用以及goto语句
--------------------------------------------------------------------------------------------------------------------------------注意到,我使用了break跳出循环,达到了我想要的效果。每行的表达式首位是行数,第二位是列数,行数不变,列数递增,每列的表达式首位是行数,第二位是列数,行数递增,列数列数,但是,除了多重循环的跳出外,建议大家减少该语句的使用。原创 2024-12-01 21:01:50 · 368 阅读 · 0 评论 -
结构体的介绍
1)结构体省去结构名,形成匿名结构体类型,此时结构体变量应在定义结构体时就创建此类结构体一般只用一次2)structdouble x;double y;}m = {1,2};double y;}*p;p = &m;说明,当同时创建多个匿名结构体类型的时候, 编译器认为它们的类型并不相同。原创 2024-12-15 15:23:48 · 1136 阅读 · 0 评论 -
函数递归的介绍
在语言中,递归就是函数自己调用自己上面的代码就是 main 函数在函数主体内 自己调用自己但是,上面的代码存在问题:main 函数反复地 自己调用自己 ,不受限制,停不下来。最终形成死递归,导致。原创 2025-01-19 12:49:13 · 1441 阅读 · 0 评论 -
C语言之assert断言
在头文件之前定义该 NDEBUG 宏。这样,编译器在预处理时就会忽略所有的 assert语句。原创 2025-01-11 16:48:43 · 420 阅读 · 0 评论 -
文件的介绍4
feof 判断的是 文件指针是否到了文件末尾ferror 判断的是 文件读写是否发生了错误。原创 2025-01-08 21:04:54 · 803 阅读 · 0 评论 -
c语言中的for循环
表达式1放在for语句前面时,定义的变量i可以在for语句和for语句之外的范围使用,for语句之外的范围依据变量i的定义位置(作用域问题后续再将)表达式1-->表达式2(真)-->循环体-->表达式3-->表达式2(真)-->循环体-->表达式3.....表达式1-->表达式2(真)-->循环体-->表达式3-->表达式2(假)-->跳出循环。3.成功输出1之后,执行表达式3一次,然后再执行表达式2,判断“i<10“为真就输出2。表达式1-->表达式2(假)-->跳出循环。将其放在循环体里面(‘;原创 2024-12-01 20:20:07 · 455 阅读 · 0 评论 -
文件的介绍2
编写程序的时候,我们可以通过各种设备(如键盘、U盘等)获得数据,当然我们也可以通过各种设备输出相应的数据到它们当中去,可程序与设备进行了怎样的操作才实现了数据的输入输出呢?显然,这里面的水太深了!一 一弄懂将会花费许多精力,所以 为了方便对各种设备的操作, 我们抽象出“流”的概念。流, 可以理解为程序 与 各种设备之间的 纽带 ,通过这条纽带,程序与各种设备之间联系紧密, “程序的话设备听得懂,设备的话程序听得懂”, 即。原创 2024-12-22 14:38:18 · 1468 阅读 · 0 评论 -
文件操作的介绍1
磁盘(硬盘)上的文件就是文件,按文件功能可将文件分为:程序文件、数据文件。原创 2024-12-19 10:23:22 · 418 阅读 · 0 评论 -
c语言中的while循环
图二中a虽然初始值也为0,但根据结果倒推可知,’++a‘显然被执行过,然后才导致死循环。我没有加入跳出循环的条件,于是程序运行之后一直打印“haha"-----当然,c语言不止有while循环还有do-while循环,for循环。图2:在程序执行遇到continue之前,同样按次序输出1 2,但是。综上,while循环与do-while循环的最大差别就是,图1:在程序执行遇到break之前,按次序输出了1 2,原来,图一中a初始值为0,表达式判别为假,不执行循环体。此时,程序输出结果一致,好像是一样的嘞!原创 2024-12-01 19:17:38 · 753 阅读 · 0 评论