自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 自定义类型:联合和枚举

上述的结构其实设计的很简单,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。代码1输出的三个地址⼀模⼀样,代码2的输出,我们发现将i的第4个字节的内容修改为55了。所以我们就可以把公共属性单独写出来,剩余属于各种商品本⾝的属性使⽤联合体起来,这样就可以介绍所需的内存空间,⼀定程度上节省了内存。联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的⼤⼩,⾄少是最⼤成员的⼤⼩(因为联合⾄少得有能⼒保存最⼤的那个成员)。联合体的特点是所有成员共⽤同⼀块内存空间。

2024-11-09 14:24:09 762 4

原创 自定义类型:结构体

⽽对⻬的内存访问仅需要⼀次访问。下图是⽹络协议中,IP数据报的格式,我们可以看到其中很多的属性只需要⼏个bit位就能描述,这⾥使⽤位段,能够实现想要的效果,也节省了空间,这样⽹络传输的数据报⼤⼩也会较⼩⼀些,对⽹络的畅通是有帮助的。4. 如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。仔细分析,其实是不⾏的,因为⼀个结构体中再包含⼀个同类型的结构体变量,这样结构体变量的⼤⼩就会⽆穷的⼤,是不合理的。

2024-11-02 15:21:37 982 5

原创 动态内存管理

有时会我们发现过去申请的空间太⼩了,有时候我们⼜会觉得申请的空间过⼤了,那为了合理的时候内存,我们⼀定会对内存的⼤⼩做灵活的调整。当是情况2 的时候,原有空间之后没有⾜够多的空间时,扩展的⽅法是:在堆空间上另找⼀个合适⼤⼩的连续空间来使⽤。但是对于空间的需求,不仅仅是上述的两种情况。有时候需要空间大小在程序运行的时候才知道需要多大的内存,那数组的编译时开辟的空间就无法满足需求了。包含柔性数组成员的结构⽤malloc ()函数进⾏内存的动态分配,并且分配的内存应该⼤于结构的⼤⼩,以适应柔性数组的预期⼤⼩。

2024-10-06 13:04:50 1326 1

原创 数据在内存中的存储

但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存⼊内存时E的真实值必须再加上⼀个中间数,对于8位的E,这个中间数是127;具体的编译器),另外,对于位数⼤于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度⼤于⼀个字节,那么必然存在着⼀个如何将多个字节安排的问题。对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M。

2024-10-05 17:56:58 1189

原创 sizeof和strlen的对比

sizeof()函数是用来计算变量内存空间大小的函数,单位是字节。如果计算的是操作数类型的话,计算的就是类型创建的变量所占内存的大小。(sizeof()只关注内存大小,不在乎内存中存放的数据)。统计的是从strlen()函数的参数str中这个地址向后,'\0'之前的字符串个数。strlen()函数会一直向后找'\0'字符,直到找到为止,所以可能存在越界访问。3.关注内存中是否有'\0',如果没有就会继续向后寻找,可能会存在越界。2.srtlen是求字符串长度的,统计的是'\0'之前的字符个数。

2024-10-05 16:13:50 249 2

原创 深入理解指针(4)

因为截图的代码,只有调⽤函数的逻辑是有差异的,我们可以把调⽤的函数的地址以参数的形式传递过去,使⽤函数指针接收,函数指针指向什么函数就调⽤什么函数,这⾥其实使⽤的就是回调函数的功能。回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应。上讲中我们写的计算机的实现的代码中,截图的代码是重复出现的,其中虽然执⾏计算的逻辑是区别的,但是输⼊输出操作是冗余的,有没有办法,简化⼀些呢?使⽤回调函数,模拟实现qsort(采⽤冒泡的⽅式)。

2024-09-15 16:54:17 522 6

原创 深⼊理解指针(3)

⾸先我们再次理解⼀下⼆维数组,⼆维数组起始可以看做是每个元素是⼀维数组的数组,也就是⼆维数组的每个元素是⼀个⼀维数组。所以,根据数组名是数组⾸元素的地址这个规则,⼆维数组的数组名表⽰的就是第⼀⾏的地址,是⼀维数组的地址。解释:p先和*结合,说明p是⼀个指针变量变量,然后指着指向的是⼀个⼤⼩为10个整型的数组。那要把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?那数组指针变量应该是:存放的应该是数组的地址,能够指向数组的指针变量。

2024-09-06 16:02:46 824 4

原创 深入理解指针(2)

那么在数组传参的时候,传递的是数组名,也就是说本质上数组传参本质上传递的是数组⾸元素的地址。同理arr[i] 应该等价于 *(arr+i),数组元素的访问在编译器处理的时候,也是转换成⾸元素的地址+偏移量求出元素的地址,然后解引⽤来访问的。parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型⼀维数组,parr[i][j]就是整型⼀维数组中的元素。,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸素 的地址是有区别的)没错,这就是二级指针。

2024-08-31 14:22:10 791 2

原创 深入理解指针(1)

Swap1()函数时,将a和b传递给了Swap1()函数,在Swap1()函数内部创建了形参x和y接收a和b的值,但是x的地址是0x0118f7cc,y的地址是0x0118f7d0,x和y确实接收到了a和b的值,不过x的地址和a的地址不⼀样,y的地址和b的地址不⼀样,相当于x和y是独⽴的空间,那么在Swap1()函数内部交换x和y的值,自然不会影响a和b,当Swap1()函数调⽤结束后回到main()函数,a和b的没法换。在上⾯的代码中,将⼀个int类型的变量的地址赋值给⼀个char*类型的指针变量。

2024-08-24 22:12:52 1321

原创 C语言的内存函数

destination:指向要复制内容的目标数组的指针,类型转换为void*类型的指针。destination:指向要复制内容的目标数组的指针,类型转换为void*类型的指针。source:指向要复制的数据源指针,类型转换为const void*类型的指针。source:指向要复制的数据源指针,类型转换为const void*类型的指针。memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。sum:需要复制的字节,size_t是无符号整数类型。ptr:指向要填充的内存块的指针。

2024-08-19 16:56:28 491 4

原创 <string.h>部分函数的使用和模拟实现

1.strlen。

2024-08-17 16:07:18 880 4

原创 扫雷游戏的模拟实现

继续分析,在棋盘上布置了雷,雷的信息(1)和非雷的信息(0),假设排查某一个位置后,这个坐标不是雷,但这个坐标周围有雷,那么需要将排查出雷的信息储存并打印出来,作为排雷的重要信息。判断是否进行展开的条件是这个坐标不是雷,且周围也没有雷的时候才会展开,如果周围有雷的话就计算周围雷的个数。假设我们访问(8,6)这个坐标时,访问周围8个坐标时会出现越界访问的情况,所以为了防止这种情况的发生,我们在设计棋盘时可以扩大一圈,将棋盘设计为 11*11 ,这样就避免了越界访问的问题。如果位置不是雷,就显⽰周围有⼏个雷。

2024-08-15 10:17:11 1268 7

空空如也

空空如也

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

TA关注的人

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