- 博客(20)
- 收藏
- 关注
原创 预处理详解
_FILE__ //进行编译的源文件__LINE__ //文件当前的行号__DATE__ //文件被编译的日期__TIME__ //文件被编译的时间__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义__FUNCTION__//当前代码所在函数这些符号都是内置,可以通过这些符号记录一些代码信息或者说是日志信息,可以根据这些信息分析代码哪里出现问题在命令行时定义,就是预处理指令不在代码内部,而是用于启动编译过程添加,也就是预编译之前,简单来说就是不会出现在源文件。
2024-02-20 18:14:06 997 1
原创 动态内存分配
堆区是由程序员分配和释放的内存区域。在堆区中分配的内存大小和生存周期由程序员控制。什么是静态区:静态区包含两部分内容:全局变量和静态变量。全局变量在程序启动时被分配,并且在整个程序的执行周期内都存在。静态变量是在函数内声明为静态变量的变量,它们在程序的整个生命周期内都存在,但是作用域仅限于声明它们的函数。这是对于程序员常用的三个区,不同的区域管理着不同数据在C语言中,动态内存分配是通过使用malloccallocrealloc和free等库函数来实现的。
2024-02-15 19:20:03 1015 1
原创 自定义类型之枚举类型(enum)和联合体类型(union)
枚举类型是一种用户定义的数据类型,它允许程序员定义一组具有命名值的常量。枚举类型通过列出所有可能的取值来定义一组相关的常量。在C语言中,枚举类型使用enum关键字来定义。枚举类型是C语言中一种简单但功能强大的数据类型,它为程序员提供了一种有效的方式来组织和管理常量。通过使用枚举类型,程序员可以编写更具表现力和可读性的代码,从而提高代码的质量和可维护性。因此,在编写C语言程序时,枚举类型是一种非常有用的类型,值得程序员们加以充分利用。联合体是一种用户定义的数据类型,它允许在同一内存位置存储不同类型的数据。
2024-02-11 15:21:18 1298 1
原创 自定义类型之结构体
/ 使用 typedef 定义结构体类型int x;int y;} Point;// 使用自定义类型创建变量// 输出结构体变量的成员return 0;自定义了一个结构体类型,就不需要再创建结构体变量时加struct,就和我们声明基本类型一样位域与正常声明变量不同,他是以位(bit)为单位来申请内存,位域是C语言中的一种数据结构,它允许程序员在一个字节(或更大的存储单元)中定义多个数据成员,且所占位的大小可以由自己定义。通常情况下,数据类型如int或char等被用来表示位域。
2024-02-11 13:36:33 1057 1
原创 C语言之内存函数
内存函数:通常指的是在编程中用于处理内存操作的函数,这些函数可以用来分配、释放、复制、比较等内存相关的操作。在C语言中,这些内存函数 、、、 都需要引用头文件 。 函数的原型如下::目标内存地址,即要将数据复制到的位置。 :源内存地址,即要复制数据的起始位置。 :要复制的字节数。 函数会从源内存地址 复制 个字节的数据到目标内存地址 ,并返回目标内存地址 。假设存在两片这样的空间由两个指针“dest”和“src”维护,解引用赋值过去相当于copy过去一个字节然后“dest++”和“
2024-02-10 19:31:49 1305 1
原创 指针进阶
指针本质上是一个内存地址,程序可以通过这个地址直接访问内存中的数据,而不需要知道其具体的值或类型,指针大小是固定的也就是说无论是什么数据类型的指针在同一平台大小相同,64位平台占8个字节,32位占4个字节。//指针的声明int a = 1;//说明这是这块内存地址存储的是一个int类型数据当然未必里面存什么类型的值就必须声明什么样的类型也可以这样int a = 1;//对这块内存地址一个字节访问这样做的好出是可以进行更细致化的操作,这个之后会用到不在这里过多阐述。
2024-02-06 16:35:07 1108 1
原创 数据在内存中的存储
C语言中有多种数据类型,这些类型可以用于存储不同种类的数据。int:整数类型,通常表示为32位。short:短整数类型,通常表示为16位。long:长整数类型,通常表示为32位(或64位,取决于编译器和平台)。long long:很长的整数类型,通常表示为64位。char:字符类型,通常表示为8位。float:单精度浮点数,通常表示为32位。double:双精度浮点数,通常表示为64位。:无符号整数类型,与int相同但只包含非负值。:无符号短整数类型。:无符号长整数类型。
2024-01-17 00:14:37 876
原创 关于类型转换
隐式转换是在不需要明确指定的情况下自动发生的类型转换。这种转换由编译器自动完成,通常是为了保持表达式的一致性,避免出现错误或警告。在C语言中,算术转换按照类型的"等级"进行,高等级的类型会将低等级的类型转换为自己的类型。
2024-01-16 15:52:28 761 1
原创 C语言中整型如何存取
关键在于读取方式不一样%d以有符号方式读取而%u以无符号方式读取,本质上i+j在内存中是相同的它们的和以二进制形式存在是1000 0000 0000 0000 0000 0000 0000 0101,如果以有符号形式读取最高位为1为负所以结果自然而然是-5,而以无符号方式读取没有符号位最高位也是数值位所以结果是4294967291。这时i+j在内存中已经不同了test3中i+j为0000 0000 0000 0000 0000 0000 1111 1011。养成思考的习惯分析这两段代码的结果。
2024-01-16 00:35:51 609 1
原创 Debug版本和release版本
在软件开发中,通常会创建两种不同的版本:Debug 版本和 Release 版本。这两种版本主要用于不同的开发和部署目的。
2024-01-14 12:14:42 445 1
原创 for语句执行流程
在每次循环迭代之前都会评估循环条件。如果条件为真,循环体会执行;如果条件为假,循环终止。在循环开始之前执行一次,用于初始化循环控制变量。在每次循环迭代之后执行,用于更新循环控制变量。
2024-01-12 17:05:47 351 1
原创 const关键字
const关键字可以用于定义常量也可以修饰变量,用于防止数据被修改,但是并不是说被const修饰的变量不能更改,仍旧可以通过多级指针获取地址修改,因为常变量本质还是变量。
2024-01-12 12:51:19 340 1
原创 assert断言
类似于Java异常捕获,都是为了提高代码健壮性,但是Java可以捕获处理,assert只用于定位错误结束运行。给出不想当前位置发生的状况,一旦条件成立就会报错。
2024-01-12 12:18:50 314 1
原创 C语言中一些常见运算符的结合性和优先级
注意:++a和a++虽然优先级是相同的但是在实际操作中a++是等所以操作完成之后再自增而++a是再执行运算前自增再参与运算,简单来说++a先取值再参加运算而a++是先参与运算再取值。在处理表达式时,通常会首先考虑运算符的优先级,然后再考虑结合性。这两个概念一起决定了表达式中运算符的执行顺序。逗号表达式:(表达式1,表达式2,表达式3)保留最后表达式3但前面的表达式也会运行。一元运算符也叫单目运算符意思是操作数只有一个。(算数运算符)+“=”把运算结果赋值变量。操作数有两个的运算符。
2023-12-29 15:52:02 487 1
原创 浅谈栈区
使用栈区好处:先进后出的结构方便随用随丢(执行完当前函数如果没有再调用其他函数就销毁)以及栈区是线性回归方便寄存器的实现,栈区的内存管理相对简单,不需要手动分配和释放内存。第三步:当main函数调用test 函数时,开始压栈,创建test函数的栈帧同时esp和edp指向test函数栈帧的起始和栈顶。返回地址:函数调用过程中,函数的返回地址会被存储在栈区中,以便在函数执行结束后返回到正确的调用位置继续执行。函数参数:函数参数是通过栈区来传递的,当函数被调用时,函数的参数会被按照一定的顺序依次压入栈中。
2023-12-27 23:36:32 1007
原创 指针初阶
二级指针存储的是一级指针对象的起始地址所以假设一个二级指针int ** pp,对他进行解应用得到是一级指针对象的起始地址,**pp解引用两次得到的是一级指针对象存储的地址。arr[n]在编译器内会被翻译成*(arr(首地址)+n)所以同理n[arr]==*(n+arr)产生的结果是相同的,简单来说就是利用了编译器的机制。允许指针指向的地址与数组最后一个元素后一个地址进行比较但不允许与第一个元素的前一个地址进行比较。例:int *p 就是int类型的指针,int * * p就是int指针型的指针。
2023-12-24 15:40:56 473 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人