自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 编译汇编链接

在预处理阶段,编译器会扫描源代码,遇到这些以 # 开头的指令时,会执行相应的操作,修改源代码的内容,然后生成一个新的、已处理过的源代码文件。例如,#include <stdio.h> 会让编译器把 stdio.h 中的代码放到这行指令的位置。作用:用于条件编译。这行指令告诉编译器:在程序中需要用到标准库中的输入输出功能(比如 printf 函数),因此要把 stdio.h 头文件的内容插入到代码中。链接器将目标文件(.o 文件)和程序所需的库(如 C 标准库、第三方库等)链接成一个完整的可执行文件。

2025-03-11 09:37:37 440

原创 预处理0.1

b、选择代码片段:在一些大型项目中(例如 Linux 内核),某个相同功能的模块往往有不同的实现,需要用户根据具体的情况来“配置”,这个所谓的配置的过程,就是对代码中不同的宏的选择的过程。此处,PI 就是宏(宏一般习惯用大写字母表达,以区分于变量和函数,但这并不是语法规定,只是一种习惯),是一段特定的字串,这个字串在源码中出现时,将被替换为3.14。由于自定义的头文件一般放在源码文件的周围,因此需要在编译的时候通过特定的选项来指定位置,而系统头文件都统一放在标准路径下,一般无需指定位置。

2025-03-10 13:51:41 537

原创 枚举和联合体0.1

枚举类型的本质是提供一种范围受限的整型,比如用0-6表示七种颜色,用0-3表示四种状态等,但枚举在C语言中并未实现其本来应有的效果,直到C++环境下枚举才拥有原本该有的属性。/*这种情况下,虽然定义了枚举常量 RED, GREEN, BLUE,但由于没有指定枚举类型的名称,无法使用该枚举类型来声明变量。// (2)、在实际开发中使用(是使用有意义的单词,来代替无意义的数字,提高程序的可读性...)联合体的外在形式跟结构体非常类似,但它们有一个本质的区别:结构体中的各个成员是各自独立的,而。

2025-03-07 20:19:31 1448

原创 结构体基础0.1

比如一个学生,典型地应该拥有学号(整型)、姓名(字符串)、分数(浮点型)、性别(枚举)等不同侧面的属性,这些所有的属性都不应该被拆分开来,而是应该组成一个整体,代表一个完整的学生。// 错误,这句话的意思是,将字符串"12345678"的首字符的地址,赋值给数组(但是数组名不可被赋值)// 你可以在此处写这个结构体的别名,没有结构体标签,意味着你只能够使用此处的给它的别名。stu_p STU_Init(void) // 返回值为stu_p结构体类型(是一个结构体指针类型)

2025-03-06 16:31:17 642

原创 存储期0.1

这里静态的含义,指的是这些变量的不会因为程序的运行而发生临时性的分配和释放,它们的生命周期是恒定的,跟整个程序一致。C语言中,变量都是有一定的生存周期的,所谓生存周期指的是从分配到释放的时间间隔。// 数据段中的data区域, 静态全局变量,本文件可见,工程里面的其它文件不可见。// 数据段中的bss区域, 静态全局变量,本文件可见,工程里面的其它文件不可见。// 数据段中的data区域, 全局变量,整个工程的文件都可以访问它。在堆中分配的变量,统统拥有自定义存储期,也就是说这些变量的分配和释放,都是。

2025-02-26 15:09:03 606

原创 作用域0.1

printf("num2(第一层) = %d\n", num2);// printf函数因为在main函数的{}括号里,所以其打印的是作用范围在main函数的{}括号里num2变量。// 存储与栈空间,作用于本函数(main)的{}括号里面。C语言中,标识符都有一定的可见范围,这些可见范围保证了标识符只能在一个有限的区域内使用,这个可见范围,被称为。// 变量只作用在这一行。printf("num2(第三层) = %d\n", num2);printf("num2(第二层) = %d\n", num2);

2025-02-25 08:56:06 503

原创 字符串函数0.1

/size_t 一般为unsigned long型在 C 语言中,size_t 是一个无符号整数类型,专门用来表示对象的大小(比如数组、结构体等)或者表示能够容纳最大对象的索引。char* MyLib_StrStr(const char *haystack, const char *needle) //MyLib_StrStr相当于strstr的 作用。if ( *p2 == '\0') // 判断p2是否指向'\0',是的话,就意味着找到了s1中的子串s2。

2025-02-24 18:41:09 480

原创 特殊函数0.1

callback(100, add, 200):调用 callback 函数,将 100 作为第一个参数,add 函数作为回调函数,200 作为第二个参数。callback(100, substration, 200):类似地,调用 callback 函数,但这次是使用 substration 函数作为回调。int substration(int a, int b) // 该函数的类型:int (int, int);return num;现在 func2(1) 返回 1,所以 2 * 1 = 2。

2025-02-23 13:29:54 1544

原创 数组的进阶

/ buf3表示的是数组的首元素的地址(&buf3表示就是整个数组的地址,切记不要写错了)printf("&shijienameda代表的地址+1 == %p\n", &"shijienameda"+1);printf("shijienameda代表的地址+1 == %p\n", "shijienameda"+1);传进去的数组,在另一个函数中,由一个相同类型的指针变量,将其数组的首元素地址获取了,后续计算的只是指针变量,而非数组。// 不可以,此处是通过p2指针,去修改常量区的数据,所以不行。

2025-02-22 11:40:57 528

原创 函数的基础内容

/ 上面的函数调用完成后,内存被释放掉,有可能被下一个函数覆盖其内存区域,所以函数的局部内存在函数结束后不可使用的原因就是如此。int func1(int a, int b) // 局部变量(栈区)3(函数的形参): - 函数的形参虽然不被花括号所包含,但依然属于该函数的局部变量。// 返回的是一个函数的临时变量的地址,所以这个地址即使可以获取,但是其代表的内存空间不能被使用。对于一个封装良好的函数而言,其对外提供服务的接口应当是简洁的,内部功能应当是明确的。// 通过传入的指针,修改数组的值。

2025-02-22 11:38:28 1477

原创 内存管理0.1

每个C语言进程都拥有一片结构相同的虚拟内存,所谓的虚拟内存,就是从实际物理内存映射出来的地址规范范围,最重要的特征是所有的虚拟内存布局都是相同的,极大地方便内核管理不同的进程。虚拟内存中,内核区段对于应用程序而言是禁闭的,它们用于存放操作系统的关键性代码,另外由于 Linux 系统的历史性原因,在虚拟内存的最底端 0x0 ~ 0x08048000 之间也有一段禁闭的区段,该区段也是不可访问的。// 可以的,因为修改的是buf数组里面的内存(已经将常量区的内存复制于此),而不是常量区的内存。

2025-02-22 09:02:49 671

原创 指针指针进阶

函数的类型,与普通变量的类型判定一致,即去除声明语句中的标识符之后所剩的语句 void fun (void ) ==>数据类型: void (void )// 一级指针,第一部分:char, 第二部分:*p11(此处的*号,是代表这个变量是指针的意思)特点:函数指针跟普通指针本质上并无区别,只是在取址和索引时,取址符和星号均可省略 void fun(void ) *p == &p ==p。// 三级指针,第一部分:char **, 第二部分:*p33。

2025-02-19 19:23:35 564

原创 数组数组进阶

/ buf3表示的是数组的首元素的地址(&buf3表示就是整个数组的地址,切记不要写错了)printf("&shijienameda代表的地址+1 == %p\n", &"shijienameda"+1);printf("shijienameda代表的地址+1 == %p\n", "shijienameda"+1);传进去的数组,在另一个函数中,由一个相同类型的指针变量,将其数组的首元素地址获取了,后续计算的只是指针变量,而非数组。// 不可以,此处是通过p2指针,去修改常量区的数据,所以不行。

2025-02-16 21:31:35 530

原创 一、指针入门指针初阶

a 是对整个数组 a 的取地址操作,它的类型是 int (*)[4](指向包含 4 个 int 的数组的指针),而不是 int*。&a 是数组的地址,类型是 int (*)[4],表示指向一个包含 4 个 int 类型元素的数组的指针。在这个例子中,*p 是一个 int 类型的值(因为 p 是 int*,指向的是 int 类型的变量)。:指针的类型决定了它指向的数据的类型。*p 访问的是 num(自己定义的) 的第一个字节,但有一点需要注意,*p 的行为和 num 的类型确实是有关系的。

2025-02-14 09:20:07 463

原创 数组内容初阶

defineCAL_ARR_NUM(A)(sizeof(A)/sizeof(A[0])) // 整个数组的大小 / 数组的首元素的大小 == 数组元素个数。// 字符数组(末尾没有'\0')char s2[5] = {'a', 'b', 'c', 'd', '\0'};

2025-02-12 20:55:54 415

原创 如何更改文件的后缀,以及默认打开方式 选择默认打开文件的方式 Ubuntu系统终端命令太长的解决方法

1,打开终端,输入命令 gedit /home/gec/.bshrc 找到第60将其中小写的w改写为大写的W保存退出后重新打开终端即可。->选择windows defender 防火墙。->将隐藏已知文件类型的扩展名前面的√去掉。->右击左下角开始,选择搜索"控制面板"->右击左下角开始,搜索控制面板。->右击要打开的文件,选择属性。->选择文件资源管理器选项。->选择启用和关闭防火墙。->选择外观和个性化。->选择更改打开方式。

2025-02-11 20:56:03 335

C语言程序入门笔记004-005

C语言程序入门笔记004-005

2025-02-08

空空如也

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

TA关注的人

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