- 博客(18)
- 收藏
- 关注
原创 数据结构中的顺序表
注意:静态顺序表存在一定的缺陷,空间给少了造成数据丢失,空间给多了造成空间浪费。注意:动态顺序表可以进行扩容,一般为原来容量的2~3倍。
2024-04-07 21:54:59 127
原创 C语言中的内存函数
这是因为int类型的数据是4个字节,再内存中数字1是以0x00 00 00 01这样的方式存储的,将每个字节的内容均修改为一,我们就可以得到0x01 01 01 01,将其转化为十进制打印就是16843009。和函数memcpy( ) 的差别就是memmove( ) 函数处理的源内存块和目标内存块是可以重叠的,如果源空间和目标空间出现重叠,可以使用memmove( ) 函数处理。如果source和destination有任何的重叠,复制的结果都是未定义的,即两块空间必须完全独立。
2024-04-07 21:52:01 261
原创 C语言中的预处理详解
x++ : y++,其中x >= y不成立,由于是后置++运算,x与y各自自增一,在这时将y的值赋值给z,所以z的值为9,之后y自增一,得到结果。:当宏参数在宏的定义中出现超过一次的时候,如果参数带有副作用,那么你在使用这个宏的时候就可能出现危险,导致不可预测的后果,副作用就是表达式求值的时候出现的永久性效果。## 运算符是将两个宏参数连接的,这样的连接必须产生一个合法的标识符,否则其结果就是未定义的。宏通常被应用于执行简单的运算,例如求两个数字的最大值,写成下面的宏,更有优势一些。
2024-04-01 22:10:22 1859
原创 编译与链接
在预处理阶段,源文件和头文件会被处理成为 .i为后缀的文件,预处理阶段主要处理那些源文件中以#开始的预编译指令。一个C语言的项目中可能由多个 .c 文件一起构建,多个 .c 文件单独经过编译器,编译处理生成对应的目标文件。注:在Windows环境下的目标文件的后缀是 .obj,Linux环境下目标文件的后缀是 .o。第一种是翻译环境,在这个环境中源代码被转换为可执行的机器指令(二进制指令)链接是一个复杂的过程,链接的时候需要把一堆文件链接在一起才生成可执行程序。,生成相应的汇编代码文件。
2024-04-01 22:09:40 203
原创 C语言中的动态内存管理
但是对于空间的需求,不仅仅是上述的情况。分析过程:char*类型的指针p为形参,单独开辟一块空间,当函数 GetMemory( ) 运行结束后,p指向的地址被销毁,这时str就还是空指针,所以无法输出str字符串,并且需要注意内存的释放。由于p是一个函数的局部变量数组的首元素地址,当函数GetMemory( ) 运行结束后,p所在的空间就被销毁了,所以p就是野指针。包含柔性数组成员的结构体使用 malloc( ) 函数进行内存的动态分配,并且分配的内存应该大于该结构体的大小,以适应柔性数组的预期的大小。
2024-03-29 21:09:18 1622 1
原创 C语言中的内存函数
这是因为int类型的数据是4个字节,再内存中数字1是以0x00 00 00 01这样的方式存储的,将每个字节的内容均修改为一,我们就可以得到0x01 01 01 01,将其转化为十进制打印就是16843009。和函数memcpy( ) 的差别就是memmove( ) 函数处理的源内存块和目标内存块是可以重叠的,如果源空间和目标空间出现重叠,可以使用memmove( ) 函数处理。如果source和destination有任何的重叠,复制的结果都是未定义的,即两块空间必须完全独立。
2024-03-29 21:07:37 362 1
原创 C语言中的选择与循环
若exp1为真,则该表达式的结果为exp2,否则该表达式的结果为exp3.continue语句:为跳过本次循环continue语句之后的代码。该表达式从左到右依次计算,该表达式的运算结果为最后一个表达式的值。else与最近的if匹配,注意表示相等时使用“==”。当代码执行到goto语句时,自动跳转到again处。while循环,do-while循环,for循环。break语句与continue语句。switch-case语句。
2024-03-29 21:06:22 201 1
原创 C语言联合体和枚举详解
而该联合体的最大对齐数是4,所以总大小为4的倍数,而且要放下最大的元素,所以结果是16。这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。而该联合体的最大对齐数是4,所以总大小为4的倍数,而且要放下最大的元素,所以结果是8。注意:在C语言中是可以拿整数给枚举变量赋值的,但是在中C++不行,C++的类型检查比较严格。相较于结构体,我们可以将物品的特有属性写入一个联合体中,这样就可以减少内存的占用。联合体的成员是共用同一块内存空间的,这样一个联合体变量的大小,
2024-03-27 19:51:47 408
原创 C语言结构体详解
位段的几个成员共用同一个字节,有些成员的起始位置并不是某个字节的起始位置,这些位置是没有地址的。第二个int类型的对齐数为4,对齐到4的整数倍,占据第4 5 6 7号字节。其中2 3号字节被浪费了。注意:在VS2022环境中,位段的内存分配是从一个内存块(1B或4B)中,由高地址向低地址分配的,如果剩余的大小不够下一个元素的大小,则该内存块的剩余位置将舍弃,在下一个内存块(相较于高地址的一个)中继续存放。如果传递⼀个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
2024-03-27 19:50:49 1753
原创 数据在内存中的存储
对与指数 E 来说,首先 E 是一个无符号数(unsigned int类型),因此存入内存时 E 的真实值必须再加上一个中间数,对于8位的 E(取值范围是0~255),这个中间数是127,对于11位的 E(取值范围是0~2047),这个中间数是1023。这时,浮点数的指数E等于-126(或者-1022)即为真实值,有效数字M不再加上第⼀位的1,直接还原为0.xxxxxx的小数,这样做是为了表示±0,以及接近于0的很小的数字。我们可以得出S=0,M=1.015,E=2。那么,S=1,M=1.01,E=2。
2024-03-25 12:00:04 304
原创 C语言字符及字符串函数详解
通过分析可知,str1 小于 str2,两字符串长度只差应该是小于0的数字,但是由于函数 strlen( ) 的输出结果的类型为size_t,差的结果只能为正数,所以无法显示正确结果。若source指向的字符串的长度小于num,只会将字符串中到 ‘\0’ 的内容追加到destination指向的字符串末尾(不会补充 ‘\0’ 字符)注: strtok( ) 函数会改变被操作的字符串,所以在使用该函数切分的字符串时一般都是临时拷贝的内容并且为可修改的类型。这些函数的使用都需要包含一个头文件。
2024-03-20 17:32:19 640 1
原创 C语言指针经典例题讲解
数组与指针可以相互表示,例如arr[ k ]可以用指针表示为 * ( arr + k ),arr[ m ][ n ] 可以表示为 * ( * ( arr + m ) + n )**注意:**在二维数组 arr[ i ][ j ] 中,arr[ i - 1 ]表示该数组第 i 行的数组名,一般用来表示该数组首元素的地址。总结:在sizeof( )操作符中,只有数组变量单独在括号中的时候才表示整个数组,其他情况均表示第数组中第一个元素的地址。答案:-4 FFFFFFFC。
2024-03-20 17:31:23 623 1
原创 C语言操作符详解
对二进制补码取反,即0变成1,1变成0.该操作符为逻辑运算中优先级最高的,需要优先计算。但是对于负整数来说,负整数m右移一位相当于(m÷2并向下取整),右移n位相当于(m÷2n并向下取整)。按照此特性,一个数^1的话就会0变1,一变0,^0的话保持不变。对于算数右移来说,正整数m右移一位相当于(m/2),右移n位相当于(m/2n)。注:左移1位相当于将该数乘以2,左移n位相当于将该数乘以2n。同一个二进制位上的数字都为1,则运算结果为1,否则均为0.只要参与运算的双方互异,结果就为1,否则结果为0.
2024-03-09 20:33:26 385
原创 C语言中的数组与函数
注:如果重复调用Fun( )函数,每次调用时的i不会被重新创建与销毁,而是使用上次的值然后在执行以下的操作。因为省略行计算机可以按顺序接着往下排列,但省略列计算机无法得知第二列排在哪里。文件中使用该变量,则需要使用 extern int a;文件中定义变量static int a = 0;extern是用来声明外部符号(多文件情况下),如果在。无static:1 1 1 1 1 1 1 1 1 1。文件中定义变量 int a = 0;在写函数递归时,优先考虑结束递归的条件。第一行 第二行 第三行 …
2024-03-09 20:32:34 353
原创 C语言指针详解三
注意:p先和*结合,说明p是⼀个指针变量,然后指向的是⼀个大小为10个整型元素的数组。所以 p是⼀个指针,指向⼀个数组,叫数组指针。在二维数组中,可以将每一个一维数组看作二维数组的一个元素,也就是说,二维数组的每个元素是⼀个⼀维数组。如果你把函数的指针作为参数传递给另⼀个函数,当这个指针被用来调用它指向的函数时,被调用的函数就是回调函数。所以,根据数组名是数组首元素的地址这个规则,二维数组的数组名表示的就是第一行的一维数组的地址。而数组指针,存放的是数组的地址,能够指向数组的指针变量,它的本质为。
2024-03-06 10:32:13 397 1
原创 C语言指针详解二
同理 arr[i] 应该等价于*(arr+i),数组元素的访问在编译器处理的时候,也是转换成首元素的地址+偏移量求出元素的地址,然后解引用来访问的。在数组传参的时候,传递的是数组名,也就是说本质上数组传参本质上传递的是数组首元素的地址,所以在函数内部是没办法求的数组元素个数的。我们可以类比于字符数组是用来存放字符的,那么指针数组就是用来存放指针变量的,指针数组的每个元素是地址,又可以指向一块区域。总结:⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。
2024-03-06 10:30:08 371
原创 C语言指针详解一
当指针变量指向⼀块区域的时候,我们可以通过指针访问该区域,后期不再使用这个指针访问空间的时候,我们可以把该指针置为NULL。这个宏常常被称为断言。其中pa为存放地址的指针变量,*pa的意思就是通过pa中存放的地址,找到指向的空间, 其实*pa就是变量a。例如: char* 的指针就只能访问⼀个字节,而 int* 的指针的解引用就能访问四个字节。概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。指针的类型决定了,对指针解引用的时候有多大的权限(⼀次能操作几个字节)。
2024-03-01 15:59:07 784
原创 C语言中的基础内容
该类型仅存在与int类型中,默认均为signed int类型,unsigned类型为无符号整形,即没有正负号。A~Z对应的ASCII码为65~90,a~z对应的ASCII码为97~122.scanf函数的返回值为它成功读取的字符个数,若发生读取错误,则返回EOF。该操作符的返回值单位为B,返回值为size_t类型,使用的占位符为%d。需要注意的是,char类型为有符号还是无符号取决于编译器,并不确定。单目操作符为只有一个操作数的符号,例如a++和++a。++a:先加一,后使用。a++:先使用,后加一。
2024-03-01 15:56:41 739
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人