- 博客(71)
- 收藏
- 关注
原创 动态内存管理
没有足够的空间时,则在堆空间上另找一个合适大小的连续空间来使用,把旧的空间释放,这样返回值时一个新的内存地址。free函数用来释放动态开辟的内存,ptr指向的是要释放空间的起始地址。如果ptr指向的空间不是动态开辟的,那么free函数的行为是未定义的;如果开辟成功,则返回一个指向开辟好的空间的指针,开辟失败则返回NULL指针;ptr是要调整的内存空间的起始地址,size是调整后的大小,这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间。常见的动态内存的错误。
2024-12-18 21:53:45
275
原创 枚举
枚举在C语言中通常用于提高代码的可读性,使得程序员可以使用更加由意义的符号代表一组相关的常量值,而不必记住这些常量对应的具体数值。{}中的内容是枚举类型的可能取值,也叫枚举常量,默认从0开始,依次递增1;在声明枚举类型时也可以赋初始值。5.枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用。2.和#define定义的标识符比较,枚举有类型检查,更加严谨。3.便于调试,预处理阶段会删除#define定义的符号。4.使用方便,每次可以定义多个常量。1.增加代码的可读性和可维护性。
2024-12-18 14:53:15
243
原创 联合体
给联合体其中一个成员赋值,其他成员的值也跟着变化,在一个时间点只能使用一个成员(根据此特点,可以在适当的时候使用联合体)联合变量的大小至少是最大成员的大小;当最大成员的大小表示最大对齐数的整数倍的时候,要对齐到最大对齐数的整数倍。像结构体一样,联合体也是由一个或多个成员构成的,但是所有成员共用一块内存空间,故联合体也叫共用体。联合体与结构体的对比。
2024-12-18 14:41:48
214
原创 位段
位段的几个成员共有同一个字节,这样有些成员的起始位置并不是某个字节的起始位置,是没有地址的,所以不能对位段的成员使用&操作符。数字表示相应的成员占几个二进制位(比特),因此位段式的结构体大小明显小于同样成员的普通结构体的大小的,其实位段的出现主要是在完成功能的情况下尽量节省内存。4.当一个结构包含两个位段,第二个位段成员比较大,无法容纳与第一个位段剩余的位时,时舍弃剩余的位还是利用时不确定的。网络传输的数据报中有许多属性只需几个bit位就能描述,这里使用位段,能够实现想要的效果,也节省了空间。
2024-12-18 14:14:36
176
原创 结构体
原因在于,为了访问未对齐的内存,处理器需要作两次内存访问,而对齐的内存访问仅需要一次访问。2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处(对齐数=min{编译器默认的对齐数,该成员变量大小};4.如果嵌套了结构体,则嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体)的整数倍。结构的每个成员可以是不同类型的变量,如:标量、数组、指针,甚⾄是其他结构体。1.结构体的第一个成员对齐到和架构提变量起始地址偏移量为0的地址处。
2024-12-18 11:37:20
530
原创 字符2
当源字符串的字符个数不够时,在末尾追加一个'\0'。strcat在追加的时候,把源字符串的所有内容,包括'\0'都进行拷贝;使用strncat时,源字符串不一定有'\0'n表示最多拷贝n个字符到目标字符串,当源字符串的字符个数不够时,就拷贝'\0'直至拷贝n个(源字符串不一定有'\0'),相对strcpy更加安全。用于查找str2指向的字符串在str1指向的字符串第一次出现的位置。
2024-12-17 21:44:47
253
原创 函数2
如果把函数的指针作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的实践或条件发生时由另外一方调用的,用于对该实践或条件进行响应。typedef是用来给类型重命名的,可以将复杂的类型简单化。函数有地址,函数名 和 &函数名 拿到的都是函数的地址。typedef关键字。
2024-12-16 20:12:56
359
原创 指针与数组
数组名就是数组首元素的地址,但有两个例外:sizeof(数组名)计算整个数组的大小,单位是字节;&数组名取出整个数组的地址,展示为首元素的地址,+1跳过整个数组。数组传参本质上传递的是数组首元素的地址,函数的形参部分理论上应该用指针变量来接收首元素的地址。一维数组传参,形参布恩可以写成数组的形式,也可以写成指针的形式。指针数组模拟二维数组。
2024-12-16 17:13:13
513
原创 指针
3.void*可以理解为无具体类型的指针(泛型指针),可以接受任意类型地址,但帮你直接进行指针的+-整数和解引用的运算。一般void*类型的指针是使用在函数参数的部分,用来接收不同类型的地址,需要使用时再转换成需要的类型。2.const放在*左边,修饰指针变量指向的对象,即不能通过指针变量修改指向的内容,但可以修改指针变量本身,即指针变量的指向;函数内部要修改主调函数中的变量的值时,需要传址调用。通过取地址操作符(&,去除变量所占的字节中地址较小的那一个)拿到的地址是一个数值,可以存放在指针变量中。
2024-12-15 09:30:38
327
原创 函数递归
很多问题递归的形式比非递归更加清晰,但这类问题的迭代实现往往比迭代实现效率更高。当一个问题非常复杂,难以用迭代的方式实现时,递归的简洁性可以补偿它所带来的运行时的开销;当用递归有明显缺陷时(比如斐波那契数列)递归函数的调用过程会占用多层函数栈帧,回归时才逐层释放,递归层次太深会导致浪费太多栈空间,可能引起栈溢出的问题。可以用迭代(循环)的方式替代递归解决问题。递归存在限制条件,且每次递归调用之后越来越接近这个限制条件。以上循环需要多次计算,计算次数成指数增长。
2024-12-10 20:40:10
199
原创 字符串和字符数组
1.C语⾔中有字符类型,但是没有字符串类型,C语⾔中字符串就是由双引号引起来的⼀串字符。与上例不同,使用常量字符串初始化的时候,数组多了一个'\0'字符。strlen函数统计的是字符串中\0之前的字符的个数。2.字符串中隐藏一个\0,是字符串结束的标志。可以使用scanf和printf函数。字符串常量初始化字符数组。字符数组的创建和初始化。字符数组的输入和输出。
2024-11-30 11:43:56
132
原创 小南找书
创建过程中使用的循环嵌套可能导致调试困难;编号比较时每次需包含大量运算,效率较低。2.编号自减(上述程序展示的方法)1.创建二维数组,进行编号的比较。
2024-11-21 11:23:25
377
原创 打印图形
1.改进binomialCoeff函数,将计算出的元素存入二维数组。1.binomialCoeff函数包含大量的重复计算。2.使用其他方法计算第n个素数,如埃拉托斯特尼筛选法。2.nthPrime函数效率低下。
2024-11-21 10:10:10
313
原创 函数
非void的函数必须使用return语句来指定将要返回的值,如果return语句中的表达式类型和函数的返回类型不匹配,那么系统将会把表达式的类型隐式转化成返回类型。在调用函数时,第一个参数是数组的名字(不包含方括号),第二个参数是数组的长度。编译器在调用前遇到原型,每个实际参数的值被隐式地转换成相应形式参数的类型。以上定义中第一个参数的值确定了第二个参数的长度(参数的顺序很重要)。用*是合法的,因为形式参数的名字是可选的。4.函数可以改变数组型形式参数的元素,且改变会在相应的实际参数中体现出来。
2024-11-17 20:23:44
1638
原创 数组
数组是含有多个数据值的数据结构,并且每个数据值具有相同的数据类型。数组的元素可以是任何类型,数组的长度可用任何(整数)常量表达式(不超过10000)指定。因为程序以后改变时昆明需要调整数组的长度,所以较好的方法是用宏来定义数组的长度。2.以下表达式可能出现警告,因为i的类型是int(有符号类型),sizeof返回的值类型为size_t(无符号类型),故可进行强制转换。初始化式完全为空或比数组长是非法的,如果初始化式比数组短,那么数组中剩余的元素赋值为0;如果数组的长度是省略的,指示符可以是任意非负整数。
2024-11-15 11:03:12
363
原创 基本类型
无符号类型,包括标准的(unsigned char ,unsigned short ,unsigned int ,unsigned long ,unsigned long long ,_Bool)和扩展的。表达式sizeof(类型名) 的值是一个无符号整数,代表存储属于类型名的值所需要的字节数。有符号整型,包括标准的(unsigned char ,short ,int ,long ,long long)和扩展的。2.字符'a'的值为97,'A'为65,'0'为48,' '为32。
2024-11-15 08:39:53
642
原创 循环
4.C99中,表达式1可以替换成一个声明,被声明的变量不需要在语句前进行声明;如果变量在之前已进行声明,这个语句将创建一个新的变量且该值仅用于循环内,不可在循环外访问。2.表达式1是循环开始执行前的初始化步骤,只执行一次;表达式2控制循环的终止;表达式3是每次循环中最后执行的一个操作。goto语句可以跳转到函数中任何有标号的语句处(C99中不能用于绕过变长数组)1. do 语句 while (表达式);2.先执行循环体,在计算控制表达式的值。1.while (表达式)语句。2.首先计算控制表达式的值;
2024-11-04 07:53:40
157
原创 选择语句
2.圆括号中的表达式必须是整型表达式,不能用浮点数和字符串;常量表达式必须是整数或字符,不能包含变量和函数调用;分支标号后可跟任意数量的语句。1._Bool flag :是整数类型,但只能赋值为0或1;向_Bool变量中存储非零值会导致变量赋值为1。①宏定义#define TRUE 1,使对flag的赋值有更加自然的形式。②#define BOOL int 可以定义一个可用作类型的宏。1.if (表达式) 语句 else 子句。case 常量表达式:语句。case 常量表达式:语句。
2024-11-01 11:01:37
269
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人