![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言学习
文章平均质量分 86
铁匠匠匠
愿天堂没有报错与警告
展开
-
从零开始学数据结构系列之第三章《哈夫曼树的构造方法》
1、在哈夫曼算法中,初始时有n棵二叉树,要经过n-1次合并最终形成哈夫曼树。2、经过n-1次合并产生n-1个新结点,且这n-1个新结点都是具有两个孩子的分支结点。原创 2024-06-29 00:12:55 · 1020 阅读 · 0 评论 -
从零开始学C语言系列之番外篇《初学单片机的路》
入嵌入式,避免不了学C语言,那初学者知道要学,但大多都不知到要学到哪,基本都是推荐C语言学完结构体,指针足以,那前面需要学啥也没讲,要学多深也没讲,基本都是一头雾水。原创 2024-06-10 00:04:13 · 647 阅读 · 0 评论 -
从零开始学C语言之入门单片机所需内容目录《总集篇》
1.【第一章】《认识C语言》2.【第二章】C语言概述及基本知识13.【第二章】C语言概述及基本知识24.【第三章】字符串和格式化输入/ 输出5.【第三章】 printf6.【第三章】 scanf7.【第三章】 putchar8.【第三章】 getchar9.【第三章】 sizeof10.【第三章】 strlen11.【第三章】 define12.【第四章】运算符第一节13.【第四章】运算符第二节14.【第四章】运算符第三节15.【第四章】运算符第四节16.【第四章】类型转换1原创 2024-06-10 00:01:49 · 560 阅读 · 0 评论 -
从零开始学C语言系列之第八章《变长数组》
sum2d()函数之所以能处理这些数组,是因为这些数组的列数固定为4,而行数被传递给形参rows,rows是一个变量。但是如果要计算6x5的数组(即6行5列),就不能使用这个函数,必须重新创建一个CLOS为5的函数。 在学习处理二维数组的函数中可能不太理解,为何只把数组的行数作为函数的形参,而列数却内置在函数体内。鉴于此,C99新增了变长数组(variable-lengih array,VLA),允许使用变量表示数组的维度。 变长数组中的“变”不是指可以修改已创建数组的大小。原创 2024-06-09 00:07:39 · 1155 阅读 · 2 评论 -
从零开始学C语言系列之第八章《函数和多维数组》
表示 ar 指向一个内含4个 int 类型值的数组(在我们的系统中,ar指向的对象占 16字节),所以ar+1的意思是“该地址加上16字节”。如果第2对方括号是空的,编译器就不知道该怎样处理。例如,编译器会把 ar[1]转换成 ar+1。编译器对 ar+1 求值,要知道 ar所指向的对象大小。如果要编写处理二维数组的函数,首先要能正确地理解指针才能写出声明函数的形参。因为第1对方括号只用于表明这是一个指针,而其他的方括号则用于描述指针所指向数据对象的类型。不过初学还是建议直接这有写,比较清晰。原创 2024-06-08 10:13:38 · 888 阅读 · 0 评论 -
从零开始学C语言系列之第八章《指向多维数组的指针》
系统不同,输出的地址可能不同,但是地址之间的关系相同。如前所述,虽然pz是一个指针,不是数组名,但是也可以使用 pz[2][1]这样的写法。 例如,不用类型转换就可以把int类型的值赋给double类型的变量,原创 2024-06-07 00:07:14 · 1016 阅读 · 1 评论 -
从零开始学C语言系列之第八章《指针和多维数组原理》
在本例中,zippo的首元素是一个内含两个 int值的数组,所以 zippo 是这个内含两个 int 值的数组的地址。下面,我们从指针的属性进一步分析。原创 2024-06-06 09:09:15 · 797 阅读 · 0 评论 -
从零开始学C语言系列之第八章《const 与指针》
虽然用#define 指令可以创建类似功能的符号常量,但是const 的用法更加灵活。那什么叫可以通过其他的引用来改变变量的值呢?那什么叫不能通过这个指针改变变量的值呢?原创 2024-06-05 00:04:38 · 1353 阅读 · 0 评论 -
从零开始学C语言系列之第八章《const入门》
关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const呢,我想事物的存在一定有它自己的道理,所以说const的存在一定有它的合理性,与预编译指令相比,const修饰符有以下的优点:1、预编译指令只是对值进行简单的替换,不能进行类型检查2、可以保护被修饰的东西,防止意外修改,增强程序的健壮性。原创 2024-06-04 00:12:03 · 1208 阅读 · 0 评论 -
从零开始学C语言系列之第八章《指针操作》
例如,用数组名、带地址运算符(&)的变量名、另一个指针进行赋值。在该例中,把urn数组的首地址赋给了ptr1,该地址的编号恰好是0x7fff5fbff8d0。变量ptr2获得数组urn的第3个元素(urn[2])的地址。也就是说,不能把 double 类型的地址赋给指向int 的指针,至少要避免不明智的类型转换。例如,可以用一个现有变量的地址初始化该指针(使用带指针形参的函数时,就属于这种情况)。无论如何,使用指针时一定要注意,不要解引用未初始化的指针!第2行的意思是把5储存在 pt 指向的位置。原创 2024-06-03 00:06:47 · 957 阅读 · 0 评论 -
从零开始学C语言系列之第八章《使用指针形参》
如果使用 * ++start,顺序则反过来,先递增指针,再使用指针指向位置上的值。如果使用( * start)++,则先使用start 指向的值,再递增该值,而不是递增指针。这样,指针将一直指向同一个位置,但是该位置上的值发生了变化。这使得while循环的测试条件是有效的,sum()函数使用一个指针形参标识数组的开始,用一个整数形参表明待处理数组的元素个数(指针形参也表明了数组中的数据类型)。 还有一种方法是传递两个指针,第1个指针指明数组的开始处(与前面用法相同),第2个指针指明数组的结束处。原创 2024-06-01 00:07:10 · 1299 阅读 · 1 评论 -
从零开始学C语言系列之第八章《函数 数组 与指针》
第2种形式(int ar[ ])提醒读者指针 ar 指向的不仅仅一个 int 类型值,还是一个 int 类型数组的元素。 简而言之,marbles是一个数组,ar 是一个指向 marbles数组首元素的指针,利用C中数组和指针的特殊关系,可以用数组表示法来表示指针 ar。 假设要编写一个处理数组的函数,该函数返回数组中所有元素之和,待处理的是名为marbles的int类型数组。应该如何调用该函数? int *ar 形式和 int ar[]形式都表示 ar 是一个指向 int 的指针。原创 2024-05-31 00:12:56 · 1006 阅读 · 0 评论 -
从零开始学C语言系列之第八章《指针与数组》
以上关系表明了数组和指针的关系十分密切,可以使用指针标识数组的元素和获得元素的值。可以认为*(ar +n)的意思是“到内存的 ar 位置,然后移动n个单元检索储存在那里的值”。因为计算机的硬件指令非常依赖地址,指针在某种程度上把程序员想要传达的指令以更接近机器的方式表达。只知道地址不够,因为计算机要知道储存对象需要多少字节(即使指针指向的是标量变量,也要知道变量的类型,否则*pt 就无法正确地取回地址上的值)。 而*(days+index)则是该元素的值,相当于 days[index]。原创 2024-05-30 00:11:44 · 997 阅读 · 0 评论 -
从零开始学C语言系列之第八章《多维数组》
类型说明符 数组名 [常量表达式 1] [常量表达式 2];其中 "常量表达式1" 被称之为行下标,"常量表达式2" 被称之为是列下标。二维数组下标的取值范围,如下所示:行下标的取值范围是:0~n-1。列下标的取值范围是:0~m-1。二维数组最大元素下标识:array[n-1][m-1]。例如:定义一个3行3列的整型数组上述代码声明了一个3行3列的二维数组,其 数组名 是array,其下标变量的类型为整形。原创 2024-05-29 00:11:35 · 1056 阅读 · 0 评论 -
从零开始学C语言系列之第八章《数组2》
注意,该编译器似乎把 value2储存在数组的前一个位置,把value1储存在数组的后一个位置(其他编译器在内存中储存数据的顺序可能不同)。。原创 2024-05-28 00:03:28 · 1216 阅读 · 0 评论 -
从零开始学C语言系列之第八章《数组》
12......... 如上所示,用以逗号分隔的值列表(用花括号括起来)来初始化数组,各值之间用逗号分隔。在逗号和值之间可以使用空格。 根据上面的初始化,把31赋给数组的首元素(days[0]),以此类推.12int index;使用数组前必须先初始化它。与普通变量类似,在使用数组元素之前,必须先给它们赋初值。原创 2024-05-27 00:10:23 · 860 阅读 · 0 评论 -
从零开始学C语言系列之第七章《指针简介2》
另外,程序必须知道储存在指定地址上的数据类型。long 和 float 可能占用相同的存储空间,但是它们储存数字却大相径庭。 例如,可以把两个整数相乘,但是不能把两个指针相乘。所以,指针实际上是一个新类型,不是整数类型。,在大部分系统内部,该地址由一个无符号整数表示。但是,不要把指针认为是整数类型。 pc指向的值(*pc)是char 类型。pc本身是什么类型?声明的意思是 pi是一个指针, 我们描述它的类型是“原创 2024-05-26 00:06:05 · 1155 阅读 · 0 评论 -
从零开始学C语言系列之第七章《指针简介》
首先,两个 pooh 的地址不同,两个 bah 的地址也不同。其次,函数调用 mikado(pooh)把实际参数(main()中的pooh)的值(2)传递给形式参数(mikado()中的bah)。概括地说,如果主调函数不使用return 返回的值,则必须通过地址才能修改主调函数中的值。如果操作对象x的类型为T,则表达式&x的类型是T类型指针(指向T类型对象 x的指针)。 与取址运算符& 相反,间接运算符* 用于当已经具有一个指针,并希望获取它所引用的对象时,因此也被称为解引用运算符。原创 2024-05-25 00:21:43 · 1354 阅读 · 0 评论 -
从零开始学C语言系列之第七章《指针引入》
看来,interchange()没有问题,它交换了u和v的值。问题出在把结果传回main()时。interchange()使用的变量并不是máin()中的变量。我们可以看到我们预想的结果并没有实现(通过这个函数来进行两个数的交换),我们将程序进一步的深入。,如果要通过函数来进行更改其他函数中的所传递过来的值,我们需要用到。除了以上这个,还可以用我们的 ^ 运算符。原创 2024-05-24 00:13:39 · 1036 阅读 · 0 评论 -
从零开始学C语言系列之第七章《递归》
C允许函数调用它自己,这种调用过程称为递归(recursion)。递归有时难以捉摸,有时却很方便实用。结束递归是使用递归的难点,因为如果递归代码中没有终止递归的条件测试部分,一个调用自己的函数会无限递归。 可以使用循环的地方通常都可以使用递归。有时用循环解决问题比较好,但有时用递归更好。递归方案更简洁,但效率却没有循环高。原创 2024-05-23 00:06:30 · 1622 阅读 · 0 评论 -
从零开始学C语言系列之第七章《函数中返回值》
条件表达式的值是n和m中的较小者,该值要被返回给主调函数。虽然这里不要求用圆括号把返回值括起来,但是如果想让程序条理更清楚或统一风格,可以把返回值放在圆括号内。 关键字 return 后面的表达式的值就是函数的返回值。在该例中,该函数返回的值就是变量 min 的值。 变量 min 属于 imin()函数私有,但是 return 语句把 min 的值传回了主调函数。那是否能像写成下面这样。原创 2024-05-22 00:01:44 · 1174 阅读 · 0 评论 -
从零开始学C语言系列之第七章《函数参数》
在函数运行时,形参和实参是不同的变量,他们在内存中处于不同的位置。形参将实参的内容拷贝一份,在该函数运行结束的时候释放,实参内容不变。实参可以是常量,变量,表达式,函数等等,但无论是何类型,在进行函数调用是,他们必须有确定的值,以便把这些值拷贝给形参。 形参变量是功能函数里的变量,只有在被调用的时候才分配内存单元,调用结束后立即释放。 形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。在调用函数时,它们都必须有确定的值,以便把这些值传送给形参。原创 2024-05-21 00:08:20 · 725 阅读 · 0 评论 -
从零开始学C语言系列之第七章《函数复习》
程序把 starbar()和 main()放在一个文件中。main()的右花括号告诉编译器该函数结束的位置,后面的starbar()函数头告诉编译器starbar()是一个函数。如果程序要多次完成某项任务,那么只需编写一个合适的函数,就可以在需要时使用这个函数,或者在不同的程序中使用该函数,就像许多程序中使用 putchar()一样。执行完starbar()中的代码后,计算机返回主调函数继续执行下一行(本例中,主调函数是main()),见图(更确切地说,编译器把C程序翻译成执行以上操作的机器语言代码)。原创 2024-05-20 00:06:36 · 1297 阅读 · 0 评论 -
从零开始学C语言系列之第六章《switch》
可以看到当我再次输入2时,只输出一个星期二,这显然break语句已经生效,也达到了我想要的结果,还有一个值得注意的是,语句是可以为空语句的,那么我们将break和空语句结合起来就可以实现下面的代码。实际生活中,需要做出很多选择,大家都知道做选择可以使用if语句,但是如果选择太多,if语句使用起来就会很繁琐,这个时候就需要一个能将代码简化的语句,也就是我们今天的主角switch语句。 case的话就是,如果你if中的条件是 case 1:,则执行 case 1后的语句,如果是case2…原创 2024-05-19 00:16:13 · 1200 阅读 · 0 评论 -
从零开始学C语言系列之第六章《break和continue的区别与作用》
(3)当break出现在循环体中的switch语句体内时,起作用只是跳出该switch语句体,并不能终止循环体的执行。若想强行终止循环体的执行,可以在循环体中,但并不在switch语句中设置break语句,满足某种条件则跳出本层循环体。 假设和上面案例同样的场景,你犯错了,你老婆罚你做5天家务,每天都是做菜,但是做菜到第三天后老婆心软了,原谅你不用做了,但后面依然不解恨,让你继续做第4、5天。(2)不管是哪种循环,一旦在循环体中遇到break,系统将完全结束循环,开始执行循环之后的代码。原创 2024-05-18 00:29:58 · 1135 阅读 · 0 评论 -
从零开始学C语言系列之第六章《continue》
假设和上面案例同样的场景,你犯错了,你老婆罚你做5天家务,每天都是做菜,但是做菜到第三天后老婆心软了,原谅你不用做了,但后面依然不解恨,让你继续做第4、5天。 如果continue语句在嵌套循环内,则只会影响包含该语句的内层循环。 3种循环都可以使用continue 语句。原创 2024-05-17 00:04:20 · 750 阅读 · 0 评论 -
从零开始学C语言系列之第六章《break》
上图示例中,循环体for " j " == 5 时遇到break后直接跳出本层循环体for “ j ”,然后继续执行外边的循环体for “ i ”,因为两个printf都是在循环体 “ j ” 中,所以这里并未打印 “Hello” 和"5"。 假设一个场景,你有一个漂亮的老婆,然后你犯错了,你老婆罚你做5天家务,每天都是给老婆做菜,但是做菜到第三天后老婆心软了,原谅你不用做了。原创 2024-05-16 00:02:40 · 952 阅读 · 0 评论 -
从零开始学C语言系列之第六章《else if》
下一个else if,因为bTrue为1,不等于0,所以当前的else if判断为true(真),通过,然后进行printf格式化输出else if true!下一个else if,else if判断为bFalse为false(假),未通过,继续执行下面的else if或else。下一个else if,因为bFalse为0,所以当前的else if判断为false(假),未通过,然后往下执行。首先执行第一个if,if判断为bFalse为false(假),未通过,继续执行下面的else if或else。原创 2024-05-15 00:30:21 · 1304 阅读 · 0 评论 -
从零开始学C语言系列之第六章《if》
顺序结果顾名思义顺序,顺序,顺序,一切按照顺序来,一步一步往下运行。代码实现:原创 2024-05-14 00:02:46 · 934 阅读 · 2 评论 -
从零开始学C语言系列之第五章《循环选择》
因此,外层循环要执行6次,row的值从 0变为 5。每次迭代要执行的第1条语句是内层的 for 循环,该循环要执行 10 次,在同一行打印字符 A~J:第2条语句是外层循环的 printf(“\n”);然而,测试条件并没有改变,所以每行依然是以F结尾,这使得每一行打印的字符都比上一行少一个。 注意,嵌套循环中的内层循环在每次外层循环迭代时都执行完所有的循环.内层循环一行打印10个字符,外层循环创建6行。 该语句的效果是另起一行,这样在下一次运行内层循环时,将在下一行打印的字符。原创 2024-05-13 00:16:30 · 977 阅读 · 0 评论 -
从零开始学C语言系列之第五章《do while》
do while循环在执行完循环体后才执行测试条件,所以至少执行循环体一次;而 for 循环或 while循环都是在执行循环体之前先执行测试条件。do while循环适用于那些至少要迭代一次的循环。 while循环和 for循环都是入口条件循环,即在循环的每次迭代之前检查测试条件,所以有可能根本不执行循环体中的内容。C语言还有出口条件循环,即在循环的每次迭代之后检查测试条件,这种循环被称为do while循环。如果是while写的。原创 2024-05-12 00:35:52 · 812 阅读 · 0 评论 -
从零开始学C语言系列之第五章《逗号运算符》
逗号运算符扩展了for循环的灵活性,以便在循环头中包含更多的表达式。 例如演示了一个打印一类邮件资费。原创 2024-05-11 00:07:48 · 745 阅读 · 1 评论 -
从零开始学C语言系列之第五章《for的灵活性》
【代码】从零开始学C语言系列之第五章《for的灵活性》原创 2024-05-10 16:44:13 · 959 阅读 · 0 评论 -
从零开始学C语言系列之第五章《for开篇》
for循环把上述3个行为(初始化、测试和更新)组合在一处。for (表达式1;表达式2;表达式3)语句;首先要强调两点:表达式1、表达式2和表达式3之间是用分号;隔开的,千万不要写成逗号。for(表达式1;表达式2;表达式3)的后面千万不要加分号,很多新手都会犯这种错误——会情不自禁地在后面加分号。 因为 for 循环只能控制到其后的一条语句,而在C语言中分号也是一个语句——空语句。所以如果在后面加个分号,那么 for 循环就只能控制到这个分号,下面大括号里面的语句就不属于 for 循环了。原创 2024-05-09 00:05:07 · 1094 阅读 · 0 评论 -
从零开始学C语言系列之第五章《循环之while》
long num;int status;return 0;==运算符是C的相等运算符,该表达式判断 status 是否等于 1。 不要把 status==1与status =1混淆,后者是把1赋给 status。根据测试条件 status == 1,只要 status 等于 1,循环就会重复。每次循环,num的当前值都被加到 sum 上,这样 sum 的值始终是当前整数之和。当status的值不为1时,循环结束。然后程序打印sum的最终值。原创 2024-05-08 00:30:45 · 1144 阅读 · 1 评论 -
从零开始学C语言系列之第四章《函数与转化》
我们前面讨论的类型转换都是自动完成的。这种情况下要用到强制类型转换,即在某个量的前面放置用圆括号括起来的类型名,该类型名即是希望转换成的目标类型。所以,函数调用 pound(10)把实际参数10传递给函数,然后该函数把10赋给形式参数(变量 n)。也就是说,main()中的变量 times 的值被拷贝给 pound()中的新变量n。在该程序中,调用pound(times)就是把 times 的值(5)赋给 n。 一般而言,不应该混合使用类型(因此有些语言直接不允许这样做),但是偶尔这样做也是有用的。原创 2024-05-07 00:12:42 · 1070 阅读 · 0 评论 -
从零开始学C语言系列之第四章《类型转换》
【代码】从零开始学C语言系列之第四章《类型转换》原创 2024-05-06 00:06:23 · 511 阅读 · 0 评论 -
从零开始学C语言系列之第四章《运算符第四节》
这两个逻辑运算符都表示:“与”,一个为False,全为False。&:表达式a & 表达式b 在运算时,表达式a和b都会被执行,进行True和False的判断。&&:表达式a && 表达式b 在运算时,如果表达式a为False,则表达式b不进行运算,直接返回结果,计算效率高。原创 2024-05-05 00:23:20 · 1253 阅读 · 0 评论 -
从零开始学C语言系列之第四章《运算符第三节》
可以看到,这个数除最低位、最高位为1外,其它各位均为0,操作的结果只会将a数中的第0、7位取反,而a数的其它位不受影响。也就是说,若需要某个数的第n位取反,只需要将该数与另一个数按位相“异或”,另一个数除了相应的第n位为1外,其它各位都为0,以起到对其它各位的屏蔽作用。 注意,这个数除第0、1位为1外,其它各位均为0,操作的结果只会将a数中的第0、1位置0,而a数的其它位不受影响。也就是说,若需要某个数的第n位置1,只需要将该数与另一个数按位相“或”,另一个数除了相应的第n位为1外,其它各位都为0,原创 2024-05-04 01:12:50 · 1027 阅读 · 0 评论 -
从零开始学C语言系列之第四章《运算符第二节》
C99 规定“趋零截断”之前,该问题的处理方法很多。//前缀形式的递减运算符。//后缀形式的递减运算符。原创 2024-05-03 00:07:18 · 1234 阅读 · 0 评论