- 博客(91)
- 收藏
- 关注
原创 88.冒泡算法(思路分析)
在一排数据中,把第一个数据与第二个数据进行比较大小。如果第二个的数据比第一个数据小,就交换他们的位置(冒泡一次),然后比较第二个和第三个,直到比较到n-1个数据和第n个数据。举例:如有一排数据:5,3,6,1,0第一次把5和3进行比较大小。很明显5和3中5大,所以就交换他们的位置,此时这一排数据就变成了3,5,6,1,0。同理:第二次比较后:3,5,6,1,0。第三次比较后:3,5,1,6,0。第四次比较后:3,5,1,0,6。如上面例子中,比较4次以后,最大的数6就到了最后面。
2024-10-24 20:43:05 176
原创 87.#include预处理命令(2)
当第一次进入myhead.h时,如果没有定义宏MYHEAD_H,就执行条件编译种的代码,第二次在进入myhead.h时,因为已经定义了MYHEAD_H,就不会在执行条件编译种的代码,这样就不会发生重复定义的问题。使用条件编译可以解决上节课的问题。
2024-10-21 19:57:38 130
原创 86.#include预处理命令(1)
当使用""时,编译器首先会在包含当前源文件的目录下查找头文件。如果在当前目录下没有找到,才会到系统指定的标准头文件路径中去查找。这种方式通常用于包含用户自定义的头文件,比如自己编写的.h文件,例如"myhead.h"。当在#include指令中使用时,编译器会到系统指定的标准头文件路径中去查找头文件。一般用于包含标准库的头文件,例如。也叫做文件包含命令,用来引入对应的头文件(.h文件)。在任意文件夹下创建一个main.c,并写入以下代码。3.修改myhead.h,代码如下。
2024-10-18 19:37:41 380
原创 84.条件编译1
条件编译允许编译器根据指定条件来选择性地编译代码的某些部分。条件编译区域以 #if、#ifdef 或 #ifndef 等命令作为开头,以 #endif 命令结尾。条件编译区域可以有任意数量的 #elif 命令,但最多一个 #else命令。
2024-09-23 19:41:00 226
原创 83.static关键字
使用static关键字修饰局部变量,只在第一次进入作用域的时候初始化。函数退出后,这些变量的值仍保持。静态局部变量的生命周期是从定义起到程序结束。使用static修饰的静态函数只能在声明所在的文件内部调用,无法被其他文件调用。静态全局变量仅当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量。static关键字可以修饰局部变量,全局变量和函数。
2024-09-18 20:42:46 223
原创 82.C语言中的内存布局2
编译程序,然后使用命令nm test | grep test_查看内存分布符号B,D等含义如下:B/b:.bss段D/d:.data段R/r:.rodata段T/t:.text段需要注意的是,char *test_str = "hello world";中的test_str在.data段,而字符串hello world在.rodata段。查看.rodata段中的内容:堆栈如何查看?
2024-09-11 20:36:36 394
原创 81.C语言中的内存分布
未初始化数据段:未初始化的全局变量和未初始化的静态变量,初始化为0的全局变量和初始化为0的静态变量。代码段:通常是指用来存放程序执行代码的一块内存区域。初始化数据段:已初始化的全局变量,已初始化的静态变量。堆:如调用malloc函数申请的内存(向上增长)。栈:如局部变量,形参,返回值。只读数据段:如字符串,数字等。栈是系统自动分配,系统自动释放。堆是程序员手动申请,手动释放。
2024-09-09 19:47:37 218
原创 79.位域
有些数据在存储的时候并不需要一个完整的字节。比如使用一个变量表示开关的状态,开关只有开和关俩个状态,所以只需要使用0和1表示,也就是一个二进制位。所以这时候使用一个完整的字节就比较浪费内存,正是基于这种考虑,C语言提供了一种数据结构,叫做位域。如果没有位宽为12的无名成员,a、c 将会挨着存储,sizeof的结果为 4;有了这12位作为填充,a、c将分开存储,sizeof的结果为 8。位域成员可以没有名称,只给出数据类型和位宽即可。在结构体成员后面使用冒号(:)和数字表示改成员所占的位数。
2024-08-28 21:37:00 214
原创 77.共用体应用场景
大端模式与小端模式是数据在内存中存储的方式。大端模式(Big-Endian)和小端模式(Little-Endian)的定义如下:1.Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。2.Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
2024-08-16 21:13:23 308
原创 75.typedef关键字(2)
/ 使用 typedef 定义一个数组指针类型array ptr;// 使用 typedef 后的数组指针类型。
2024-08-09 23:51:18 341
原创 74.typedef关键字(1)
typedef关键字:给其他类型起别名。为什么要给其他类型起别名?C语言定义变量的语法:int a;Fortran语言定义变量的语法:intrger :: a;为了让Fortran的程序员快速上手C语言,所以C语言的开发者就开发出了typedef关键字。
2024-08-07 19:55:16 238
原创 72.结构体变量直接赋值
因为指针共同指向了一个相同的地址,所以该地址指向的值发生变化会都发生变化。所以需要补充的结论是:如果结构体中有指针成员,切勿直接赋值,要分开赋值,否则成员之间会互相影响。通过实验,这个例子也可以运行成功,如果我们修改一下结构体变量x中的title成员,会发现结构体变量z中的title成员也会发生变化。通过上节课的学习得出了一个结论:俩个相同类型的结构体变量直接可以只用赋值号进行赋值。我们改一下这个例子,在test结构体中添加一个指针类型的成员。这是为什么呢,我们来看这张图。很显然,这是不正确的。
2024-08-01 21:15:34 338
原创 71.结构体参数传递
如果结构体变量可以作为函数参数,那么俩个相同类型的结构体变量直接可以只用赋值号进行赋值。结构体变量可以作为函数参数和函数返回值。
2024-07-30 21:32:38 157
原创 68.结构体嵌套
结构体嵌套指的是在结构体中含有结构体类型的成员。举例定义一个结构体用来存放一个人姓名,性别,出生日期,年龄,就可以使用结构体嵌套。
2024-07-23 21:32:38 183
原创 67.结构体变量
注意:定义结构体类型变量会在内存中分配空间语法格式:struct 结构体的名称 结构体变量名举例:}mybook;//这种写法是全局变量。
2024-07-19 22:12:40 174
原创 66.函数指针和回调函数
回调的意思一个函数具有函数指针类型的函数参数,将这个函数指针作为函数参数传到函数里面,当函数执行完之后,再执行通过函数指针传进去的这个函数。这个过程就叫做回调。(或者说通过函数指针调用的函数叫做回调函数)函数指针最多的一个用处就是回调函数。
2024-07-15 22:22:40 179
原创 65.指针函数和函数指针
函数的类型指的是函数返回值,比如返回整型,浮点型,字符型,指针类型等等。指针函数指的就是函数返回值是指针类型的函数。注意:不要返回局部变量的指针。
2024-07-10 22:41:12 323
原创 63.指针常量和常量指针
1.指针常量自身不能被修改,但是指向的地址中的值可以修改。2.常量指针是指针指向的地址中的值不能被修改,但是可以改变常量指针的指向。
2024-07-01 21:38:41 322
原创 62.指针和二维数组(2)
1.如a是一个二维数组,则数组中的第i行可以看作是一个一维数组,这个一维数组的数组名是a[i]。2.a[i]代表二维数组中第i行的首个元素的地址,即a[i][0]的地址。
2024-06-27 23:00:03 339
原创 61.指针和二维数组(1)
在一维数组中,一维数组的数组名就是一维数组中首个元素的地址。若有int a[5];int *p;则p=&a[0]可以简写成p=a;在C语言中,二维数组如int a[2][2]={1,2,3,4};可以按照下面的表格来理解。列0列1行0a[0][0]=1a[0][1]=2行1a[1][0]=3a[1][1]=4但是在内存中的存贮则是所以二维数组又叫数组的数组,本质上还是一维数组。因为二维数组中的一行可以看作是一个一维数组,而这个一维数组的数组名是a[0]和a[1]。
2024-06-24 23:13:37 301
原创 60.指针数组和数组指针
指针数组是一个数组,在指针数组中存放的是指针变量。定义一个指针数组pint *p[5];内存模型如下:指针数组的初始化。
2024-06-19 21:51:29 363
原创 59.指向指针的指针(二级指针)
return 0;解析:所以printf输出的结果是100。往下思考:指针变量也是变量,也有自己的地址。对指针变量p取地址(&p)就可以拿到指针变量p的地址。在讲指针的时候我们说指针变量存放的是地址(普通变量的地址),只不过用来存放指针变量的地址的指针叫做指向指针的指针,也叫做二级指针(用来存储指针变量的地址)。数据类型 **变量名 = 指针变量地址;return 0;
2024-06-15 00:20:29 282
原创 58.强制类型转换
当int a=2,int b=3,double x=3.5,double y=2.5,则表达式(double)(a+b)/2 + (int)x%(int)y的值是多少?这个值的类型是什么?从占内存小的类型向占内存大的类型转换精度不会丢失,如转换方向为char->int->long->double。强制类型转换可以实现类型之间的互相转换。并且会自动进行转换。类型是double类型。
2024-06-13 22:02:36 394
原创 57.void指针(万能指针)
在定义变量的时候,需要用到变量的类型,变量的类型在表示在内存中的大小,而void是空,表示的是无类型。所以如果用void来定义一个变量会发生错误(无法在内存中挖一个坑)。所以不可以用void定义变量,但是可以使用void来定义指针。void指针我们称之为通用指针,或者万能指针,因为他可以指向任意类型的数据。换句话说,任意类型的指针都可以赋值给void指针。
2024-06-04 22:48:06 242
原创 55.指针和数组
结论:1.数组名是数组中第零个元素的首地址2.数组中元素的首地址+1,地址不一定+1,而是增加数组中元素类型的大小。3.对数组名取址得到是数组中第零个元素的首地址,执行+1的操作地址会增加整个a数组的大小。而不是增加数据中元素类型的大小。
2024-05-21 22:13:13 178
原创 54.指针
口语中的指针一般指指针变量,指针变量存放的是一个地址。普通变量存放的是数据。如变量在内存中存储方式如下:编译器把变量名a和地址0x0001进行了关联,所以用变量名a可以访问地址为0x0001的数据1。本质是通过地址访问数据。而指针变量存放的是一个地址,如果指针变量存放的地址是0x0001,那这个指针变量是不是也可以访问地址为0x0001的数据1呢。这个就是指针变量的作用。定义指针变量类型名 *指针变量名如 char *p;
2024-05-15 22:45:05 284
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人