
开发语言
文章平均质量分 81
金创想
这个作者很懒,什么都没留下…
展开
-
“半身不遂”的逗号操作符
逗号(,),意味着两边是不完整的,它不光能分隔变量、参数,还能作为操作符参与运算。今天就来讲讲逗号操作符。原创 2025-01-25 19:26:02 · 847 阅读 · 0 评论 -
C语言结构体简介:“结”在一起,“构”成一“体”
我们一般把结构体中的元素称为“成员”,这些成员的定义就和定义普通变量的方法一样。结构体就是拉了一伙“成员”,组成个大家庭,这个大家庭的名字由大括号前的结构体名定义。注意,这种用大括号{}的初始化方式只能在定义变量的同时进行,就和数组的初始化是一样的。因为已经定义了结构体变量,hero与它上面的结构体自然地捆绑在一起,所以这种情况还可以把结构体类型的名字Person省略掉。它传递的是全部成员的值,也就是将实参中成员的值一一赋值给对应的形参成员。结构体中的元素类型不能是结构体本身的类型。原创 2024-12-29 20:27:18 · 726 阅读 · 0 评论 -
巧记斜边函数hypot
hypot是一个数学函数,源于英文"hypotenuse(斜边)",hypot(a, b)返回直角边边长为a、b的直角三角形(right-angled triangle)的斜边长度。最典型的就是水流,高山流水,自上而下,简称“下流”——“下”对应under,“流”对应stretch。hypo是个前缀,指“under下面”,tenuse和tense很像,其实它俩是同源的,都来自词根tend,指“stretch延伸”。这个函数的用法没什么难的,关键是hypot、hypotenuse看着比较生分,不太好记。原创 2024-12-20 18:18:09 · 856 阅读 · 0 评论 -
野指针:编程界的“野孩子”
因此,如果函数返回了一个指向局部变量的指针,那么这个指针将指向一个已经不再有效的内存区域,即所谓的“悬空指针”。当然,在使用动态分配的内存时,还需要注意在适当的时候释放它,以避免内存泄漏。此时,指针变量的值是随机的,它可能指向任何一个内存地址,而这个地址很可能是程序不应该访问的。你可能因此而闯入一个充满毒蛇猛兽的火山口上面,没人理会你的哭叫,没人理会你的哀嚎,被别人狠狠地,毫不怜悯地将你用脚一踢,踢到滚烫的岩浆里头。这是野指针的进阶版,内存释放后之后,指针就如幽灵一样,已经死了,却还有那么一缕灵魂。原创 2024-11-27 20:00:00 · 1174 阅读 · 0 评论 -
全局变量与静态变量的区别
因为它的值一直存在内存中,所以如果把静态局部变量放在函数中,即使在函数返回后,再次调用该函数时,该变量仍会保持上次调用结束时的值。静态变量可以是全局作用域内的静态变量(在main函数外声明的静态变量),也可以是局部作用域内的静态变量(在main函数内声明的静态变量)。作用域、链接性指的是变量可以在什么地方使用,生命周期指的是变量的值在内存中保留多久,前者是空间属性,后者是时间属性。无链接性,因为只在声明它们的函数或代码块内可见,所以它们是属于花括号的私人所有,金屋藏娇,别人连勾搭一下都不行。原创 2024-11-15 17:03:57 · 1849 阅读 · 0 评论 -
内存泄漏简介:不断消耗资源的吞噬者
你一直占着茅坑一直拉,你占的时间越长别人能用的时间就越少,你拉得越多别人能拉的就越少。内存心里苦啊,就好像古代宫中的三千佳丽,很多连皇上的面都没见过,却又不能交别的朋友,白白地虚耗了青春。这是很简单的道理,就像你占着茅坑,只顾一直拉啊拉,从不去淘宝,最后就会溢出来。遵循编程语言和开发框架的最佳实践,例如使用RAII思想管理资源,用适当的数据结构、算法和编程范式等,可以减少内存泄漏的发生。全局和静态变量的生命周期与程序一致,如果它们持有动态分配的内存,那么这些内存将在程序结束之前一直无法被释放。原创 2024-11-13 16:48:48 · 612 阅读 · 0 评论 -
“&“和“*“:身怀绝技的双飞客
也有超级侦探的一面,这位神探善长的技能是按图索骥,只要你给出任何人的地址,它就能立马找到这个人。C语言里指找到用于获取指针指向的变量的值,其实也就是这个变量本身(值就是变量到底是什么,是变量的本质)。自然不是int型,也不是double、char型,她绝不是这么普通单调乏味的类型,一定是一个综合类型,就叫她“对象”吧!对两个操作数的每一位进行逐位比较,相应位都为1时,结果的相应位才为1,否则为0。"&"和"*"是C语言里面的两个斜杠青年,不同的形式具有不同的作用。星号还用于声明一个指针类型的变量。原创 2024-11-12 14:26:19 · 392 阅读 · 0 评论 -
指针简介:欲送你花,先找你家
在声明指针时,*被称为“指针声明修饰符”,虽然叫了个新名,但和前面讲的解引用运算符本质上是一样的,都是获取指针指向的变量的值。的本质含义是这样的:取出指针p指向的变量的值,这个值是int类型的。的意思是p是一个指针,*p是int类型。说的是取出指针p指向的变量(为方便说明,假设这个被取出来的变便为q)的值,这个值还是一个地址,然后再取出q指向的变量的值,这个最后取出来的值是int型,也就是**p是int型。指针偏移指的是加减运算,需要注意的是,加减的单位不是字节,而是指针所指向的数据类型的大小。原创 2024-11-08 18:57:47 · 1613 阅读 · 0 评论 -
玩转类型美容师:typedef
从二者名字可以看出,typedef是专门用于给类型下定义的,其目的是让复杂的类型声明变得更简单、更直观。会声明两个指针变量p3和p4,因为typedef是将INTPTR2定义为int*类型的别名,所以使用INTPTR2声明的变量都是int*类型的指针。(2)typedef可以为指针类型及更复杂的数据类型定义别名,而#define在定义这些类型时可能会引发一些意想不到的问题(如优先级问题)像指向数组的指针、指向函数的指针,这些复杂的类型声明,简直就是编程界的“噩梦”。typedef是在编译时处理的。原创 2024-11-07 17:08:45 · 1328 阅读 · 0 评论 -
字符串转数字:三大库函数
这个玩艺比较复杂,它是指针的指针。如果你完成了一次转换,实际上可能只把str前面n个字符转换为数字(比如95-27,只转换了95),那这个已转换的字符里的最后一个字符的下一个字符的地址(也就是“95-27”中的“-”的地址),就是要赋给str_end的东东。代码整体分两部分,“// parsing with error handling”下面的是带有错误处理功能的代码,“// parsing without error handling”下面的是不带错误处理功能的代码(咱们最开始给出的例子就是这种方式)。原创 2024-11-01 19:50:17 · 3108 阅读 · 0 评论 -
强制结束输入的方法
如果输入:2 CTRL+Z,结果和前面一样,也能实现强制结束输入的效果,有人就会误认为这里是CTRL+Z起到了发出“输入结束”信号的作用。从表中可以看出,输入“2 x”和“2 CTRL+Z”无论是求和结果还是scanf函数的返回值都是一样的,因此二者是一回事,都是靠输入类型不匹配实现强制结束输入。一文中讲过, Windows的输入结束信号是Ctrl+Z,具体步骤是:输入完毕后按Ctrl+Z键,再按Enter键,即可结束输入。如果scanf要求输入两个数,现在只输入一个数,想要结束输入该怎么办呢?原创 2024-09-02 11:52:50 · 888 阅读 · 0 评论 -
一文搞定“宏”
它用于宏定义中的替换列表中,会把其后的宏参数转换为一个用双引号(quotes)括起来的字符串。宏替换就是简单的文本替换,它是在编译阶段完成的(相当于Word里的查找替换),因此它在执行时不需要函数调用的开销:传递参数和返回值等,所以宏比函数在程序的内存开销和速度方面更胜一筹。需要注意的是,如果类函数宏的参数含有逗号,逗号只会被识别为参数的分隔符(separator),而不会被识别为逗号操作符。①条件判断(x++)>( y++),结果:x++表达式的值为3,y++表达式的值为7,x=4,y=8。原创 2024-05-17 17:47:39 · 1829 阅读 · 0 评论 -
不干人事的表达式:(void)0
它想对世界表达的不是“我是这样一个类型”,而是“我什么类型都不是”。(void)就像(int)一样,表示强制类型转换,后面的0是一个整型数。这是一个宏替换,它定义了一个名为 assert 的宏,它接受一个参数_Expression。也就是说,它是为调试而生的,显然不应该让调试产生的值影响正式代码的运行。这就是要生成表达式的原因,而0是最简单的表达式,不用它还用谁呢?这时候(void)这把圆月弯刀就派上用场了,因为强制转为void型,表达式没了返回值,因此不能赋给任何变量,也不能做任何函数的参数。原创 2024-05-15 17:21:20 · 802 阅读 · 0 评论 -
字符类型判断库函数合集
控制字符是那些用于控制文本流而非直接表示可打印字符的字符,其ASCII范围:0x00-0x1F和 0x7F(0-31和127)。常见的控制字符为:退格、水平制表符、换行键、回车键、删除。空白字符有6个:空格(' ')、水平制表符('\t')、换行符('\n')、回车符('\r')、垂直制表符('\v')和换页符('\f')。可打印字符是那些可以在文本中显示并且具有实际意义的字符,它比图形字符多了一个空格(' ')。isspace检查一个字符是否是空白字符(white-space character)。原创 2024-04-23 20:46:50 · 563 阅读 · 0 评论 -
深度剖析“字符串与数组、指针”的关系
字符串的本质是数组,数组的本质是占用连续内存单元的多个变量(每个内存单元大小相同,就像把一整板豆腐切成大小相同的小块,每一块可看成一个内存单元,每个内存单元存储着一个变量——数组元素)。:因为是直接将字符串的首地址赋给指针,这里的字符串会被当作字符串常量,存储在程序的只读数据段(也称为文本段或代码段)中,因此用这种方式初化始后字符串是不能改变的。在C语言中,字符串是以字符数组的形式存储的。:这是用数组的方式初始化,字符串存储在程序的可写数据段(如堆或栈)中,因此你可以修改str数组中的字符。原创 2024-04-21 16:31:45 · 968 阅读 · 0 评论 -
常用变量名合集
数学中通常用x,y来表示坐标,同样的,在命名变量时,可以使用一些具有特定含义的单个字符。prev:previous的简写,表示前一个元素或节点(链表、栈等)。item:表示数据结构中的一个单独元素(列表、数组、集合或队列等)timestamp:时间戳,表示一个特定的时间点或日期时间标记。handle:表示一个指向某种资源、对象或数据结构的引用或指针。i、j、k:常用于循环中的迭代变量,尤其在嵌套循环中。tail:表示数据结构的最后一个节点(链表、队列等)。head:表示数据结构的起始节点(链表、队列等)。原创 2024-04-11 19:18:17 · 1525 阅读 · 0 评论 -
非常绕的“输入结束”信号
那用什么发出“输入结束”信号,之前的文章“用恋爱脑搞懂scanf的返回值”已有介绍,在Windows下,输入完毕后按Enter键,然后按Ctrl+Z键,再按Enter键,即可结束输入。当输入完数据后,按Enter键再按下Ctrl+Z,然后再按下Enter,就会向当前正在执行scanf函数发出“输入结束”信号,当前scanf函数在没有任何有效输入的情况下结束输入。所以,准确地说,Ctrl+Z发出的“输入结束”信号是没有任何输入的“输入结束”信号。循环输入的代码很简单,但是用户的“输入结束”信号是什么呢?原创 2024-04-01 23:10:47 · 599 阅读 · 0 评论 -
神经错乱的连赋值
像a=b=c=1、a+=b-=c*= 1这样的连赋值具有极简的形式,因此常用来炫技。但是它也会极难理解,甚至,它还会有精神分裂、神经错乱之时。原创 2024-03-02 20:41:50 · 537 阅读 · 1 评论