自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(8)
  • 收藏
  • 关注

原创 解剖一只麻雀,当正则表达式\w*匹配‘a-b‘的时候,到底发生了什么?

第一步,NFA正则引擎让\w*去匹配a,匹配成功,findall返回a。于是回溯,再次匹配-,因为上一次的贪婪模式没有配上,这次采用零字符模式,零字符模式自然成功,匹配空字符,返回空字符''。竟然成功了,趁热打铁匹配b,优先应用多字符匹配,成功返回b,最后来到字符末尾$,尾标记$和\w*匹配不上,\w+又一次不承认失败,坚持再次回溯,重新以零字符匹配,再次成功,第二次返回空字符。继续下一次匹配,但这时已经到达字符串末尾后面,整个匹配全部结束,最终findall返回列表['a','','b','']。

2024-05-10 17:40:42 355

原创 转义符的本质

每一个字符至少有两方面的含义,字符本身的形象和字符指向的事物,这两者之间的切换需要用到转义。比如字母n,在操作系统中默认表示本身形象,当指向换行符时是\n。在正则表达式中,+默认表示字符重复次数,\+表示字符本身形象。有些外国女人把汉字鸡纹在身上,默认的是第一层意义,作为本身形象的字符鸡,而在汉语里,鸡默认的是第二层意思,指向某类女人。如果她懂汉语,纹在身上的鸡应该加转义符,\鸡。

2023-11-13 10:55:09 48

原创 为什么常量是右值?

常量是右值的原因在于常量只提供内容,常量只表示内容,左值表示的是地址,int i=5;r是个右值引用,表示地址,是左值,绑定右值5。临时对象提供内容,所以是右值,右值引用必须绑定右值,如果绑定左值,也就是说绑定一个地址,没有意义。指针变量的内容是地址,所以指针是左值,*p是右值,int *p=&i,等号左边是地址,右边也是地址,左值对左值,没毛病。这个判断标准没有可操作性,因为对编译系统来说,所有的数据都能取得地址,只要它存储在内存中,常量存储在内存的静态存储区,可以取得地址,可常量是右值。

2023-08-30 11:43:41 110

原创 变量名与引用,指针,*,&的关系

首先明确一个我的假说,变量名是一个映射,是对内存地址+数据空间的映射,数据空间是数据类型所占字节数的表述,所以变量名反映的是地址+字节数这个信息。person &mn=per,因为mn是引用,所以这是把per的地址传给mn,空间大小没有传递,mn通过类person知道空间大小,没有必要再传过去。person *mn=&per,这也是把per的地址传过去,&表示只传地址,单写per也没错,指针mn只能接受地址,空间大小已被类person告诉了。

2023-08-26 11:28:53 125 1

原创 既然变量名是地址,为什么给指针初始化要给变量加&?

答:因为变量是基本数据类型,基本数据类型都是按值传递的(初始化或赋值符号可以看作一个函数),既然按值传递,就要在变量名前加取地址符号。如果变量名代表数组或对象,他们按址,变量名前不用加不加&都可以,原理是变量名不保存在内存中,&var不是取内存地址意思,只是通过变量名找到映射的地址。

2023-08-24 17:10:45 184 1

原创 C++的引用不是变量的别名,理由如下

所谓别名,是指某个对象有两个名字,这两个名字指代同一个主体。但引用和别名不是这样的,比如,作为函数的参数,按变量名传参数和按引用传参数,函数的行为不一样,一个是按值传递,一个是按地址传递,所以引用不是变量的别名,他是阉割了的指针,为了安全性,去掉了指针的一些性能。用typedef定义的类型才是严格意义上的别名。

2023-08-24 16:52:39 49 1

原创 证明数组名a等价于&a

数组名a是数组a的首地址,所以a==&a[0],&a[0]等不等价于&a呢?考虑到数组名a不是变量,在内存中没有地址,所以&a肯定不是变量的地址,它代表的是整个数组的空间,入口和首地址&a[0]重合,所以a==&a。

2023-08-23 18:19:49 110 1

原创 在scanf函数中,当输入字符串时,str与&str的思考,即对scanf(“%s”,str)与scanf(“%s”,&str)的解释

当输入一个字符串时,字符串存在一个字符数组中,假设这个数组的数组元素为4,数组名str代表1100:4这个地址,则&str代表1100,两者都是scanf函数需要的,但数组不是基础数据类型,所以不加&也不会报错。时系统会在内存中预留一个4 字节的内存空间,为了调用的时候找到这个内存空间,必须把地址记录下来,这个地址的记录格式类似xxxx:xxx,:前的部分是基础地址,后面是偏移量,如本例,这个地址可能是1000:4,整型变量是4字节,那就在基础地址上偏移4个字节。闲话不说了,下面上干货。

2023-08-23 10:57:52 230

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除