![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
深度理解C语言
文章平均质量分 88
C语言的深度理解
三眼五显仙人~
三眼五显仙人,魈,听召,前来守护。
展开
-
【深入理解递归、了解命令行参数】
C语言的命令行参数是指在程序运行时,通过命令行传递给程序的额外信息。当我们在终端或命令提示符中执行一个C语言程序时,可以在程序名后面添加参数,这些参数将被传递给程序并在程序内部使用。在C语言中,命令行参数主要通过main函数的参数来接收。main函数也是一个函数,其实也可以携带参数的,标准的mainmain函数的参数包括argc和argv,分别表示命令行参数的数量和参数字符串数组。argc是一个整数,表示命令行参数的数量,包括程序名称本身。至少会有一个参数,即程序的名称。argv。原创 2023-07-24 11:55:24 · 447 阅读 · 0 评论 -
【可变参数列表如何可变?】
本章重点学会使用可变参数列表的使用与原理函数传参补充知识求两个数据中的最大值使用va_list类型的变量声明一个可变参数列表的访问指针,通常命名为arg。使用va_start(arg, last_fixed_param)宏来初始化可变参数列表。是最后一个固定参数的名称,也就是num,在这个参数之后是可变数量的参数。这个宏会将arg指针指向可变参数列表的起始位置。使用va_arg(arg, type)宏来获取可变参数列表中的参数值。type是参数的数据类型。原创 2023-06-18 21:28:19 · 307 阅读 · 1 评论 -
【深入理解函数栈帧:探索函数调用的内部机制】
本章重点了解汇编指令深刻理解函数调用过程。原创 2023-06-10 18:34:32 · 800 阅读 · 2 评论 -
【突破常规:让函数规范成为注目的亮点】
One。原创 2023-06-08 18:20:37 · 87 阅读 · 0 评论 -
【内存管理大猫腻:从“越界”到“内存泄漏”应有尽有】
什么是动态内存。原创 2023-06-05 20:55:38 · 276 阅读 · 3 评论 -
【程序猿必备:指针与数组的高级技能秘籍】
整形指针数组,数组内部,后面可以放置任何类型(内置、结构体、联合体等)的内容。整形数组指针,指针可以指向任何合法的类型变量。我们发现我们在定义变量的都是先写变量的类型,然后再写变量名。提示:数组的数据类型是int [num]。数组指针一般使用的时候都是指向整个数组的地址。//变量类型为char,变量名为cchar c;//变量类型为int,变量名为aint a;//变量类型为double*,变量名为bdouble* b;//那我们定义数组应该是int[5] d;原创 2023-06-01 22:00:05 · 629 阅读 · 11 评论 -
【从浅入深,全面掌握数组的操作与优化技巧】
数组的内存布局我们来看一下运行的结果指向类型强制类型转换数组名使用的时候,只有两种情况代表整个数组。原创 2023-05-27 14:41:26 · 983 阅读 · 0 评论 -
【指针:掌握它,让你的程序如虎添翼】
(先分开) 但是,我们经常在口语化表达的时候,又经常将这两个概念混合,具体原因无从考证,不过个人认为与最早的C资料(书, 文档之类)的翻译有关。这两行代码定义一个指向整型变量的指针 p,并将它初始化为 NULL,然后将指针 p 的地址强制转换为一个指向指针变量的指针,并将转换结果赋值给 p。由于指针 p 指向的地址已经被改变,因此原来存储在 p 中的指针地址会丢失,不再指向之前的变量。`*p = NULL` 是对指针p所指向的内存单元进行操作,而`p = NULL`是对指针p本身进行操作。原创 2023-05-26 21:47:03 · 1033 阅读 · 0 评论 -
【文件包含的本质、预处理符号、# vs ##】
在`main`函数中,首先使用`1.1e2`的科学计数法直接输出了`110.000000`,然后使用`CONT(1.1, 2)`宏对参数进行拼接,得到了相同的结果。第一次包含头文件时,`XXX`未被定义,`#ifndef` 判断为真,进入条件编译块,`#define XXX` 定义符号 `XXX`,然后包含头文件的内容。程序定义了一个名为`__welcome`的宏,并使用了条件编译指令`#ifndef`和`#endif`来判断`__welcome`宏是否已经定义。那么,重复包含一定报错吗?原创 2023-05-25 15:38:59 · 1070 阅读 · 0 评论 -
learn_C_deep_14 (条件编译的基本使用与理解)
目录条件编译1.条件编译如何使用?2.为何要有条件编译?3. 条件编译都在哪些地方用?#if模拟#ifdef#if模拟#ifndef练习#if 和 #ifdef的区别条件编译和宏替换谁先执行条件编译可以用来注释代码吗?推不推荐?结论:条件编译本质是让编译器进行代码裁剪。原创 2023-05-23 21:09:11 · 713 阅读 · 0 评论 -
learn_C_deep_13 (深刻理解宏定义)
在C语言中,宏定义可以用于定义数值宏常量。数值宏常量是一个值,在宏定义中用一个常量名称来表示,该值在后续的代码中可以被多次引用。数值宏常量主要有以下几个特点:1. 可以是整数或小数:可以定义整数或小数的数值宏常量,例如:#define PI 3.14。2. 没有类型:宏定义中的数值宏常量没有类型,因此可以在代码中使用时自动转化为相应的类型。3. 通常使用大写字母:为了方便识别,通常将数值宏常量的名称使用大写字母来表示,例如:#define MAX_NUM 100。为何这些字面值建议定义成宏?原创 2023-05-21 21:34:59 · 1298 阅读 · 2 评论 -
learn_C_deep_12 (深度理解“取整“、“取余“、“取模“运算、掌握运算符优先级 )
这里特别注意,我们在使用格式化输出时,必须使用%f来输出浮点数,而不能使用%d来输出整数,因为%d会将浮点数转换成整数,并截取掉小数部分,造成输出错误。4. 接下来,代码使用trunc()函数对2.9和-2.9进行了向零取整的操作,并将结果强制转换成整型,然后使用printf()函数打印了结果。由于i和j的类型为整型,因此在初始化时,浮点数部分会被截断,只保留整数部分,i的值为-2,j的值为2。其中,q 被称为商,r 被称为余数。例如,-2.9的向下取整结果为-3,而2.1的向下取整结果为2,符合预期。原创 2023-05-20 19:36:21 · 1898 阅读 · 0 评论 -
learn_C_deep_11 (深刻理解整形提升、左移和右移规则、花括号、++和--操作、表达式匹配:贪心算法)
那么,在实际移动的过程中,是在寄存器中进行的,即大小固定的单位内。这个表达式中,先进行加法运算2+3,结果为5,然后再对0x01(二进制为0000 0001)进行左移5位操作,即在二进制的右侧补5个0,得到的结果为0010 0000,即十进制的32。中,它是一个后置++运算,它的作用是先将a的值赋给b,然后再执行自增操作,因此,最终a的值为11,而b的值为10。中,这是一个前置++的运算,它的作用是先让a自增1,然后再将自增后的值赋给b,因此,最终a和b的值都变成了11。a++完整的含义是先使用,在自增。原创 2023-05-19 15:23:57 · 545 阅读 · 2 评论 -
learn_C_deep_10 深刻认识C语言重点操作符
在C语言中,注释指的是在程序代码中添加的一些说明或标记,这些注释并不会被编译器解析和执行,仅仅是为了帮助程序员更好地理解代码。C语言中支持两种注释方式:1. 单行注释:使用“//”符号标记注释内容,从“//”开始到该行结尾处都被视为注释,编译器会忽略这些内容。例如:2. 多行注释:使用“/*”和“*/”符号包含多行注释内容,从“/*”开始到“*/”结束的所有内容都被视为注释,编译器会忽略这些内容。例如:注释是一种很重要的编程技巧,它可以增强代码的可读性和可维护性,方便其他人或自己在之后修改代码。原创 2023-05-16 21:44:28 · 496 阅读 · 2 评论 -
learn_C_deep_10 extern在多文件下的理解、struct 关键字的理解与柔性数组、union 的内存级布局理解、enum 关键字的基本理解、typedef 的理解与分类、关键字总结
存储关键字,不可以同时出现,也就是说,在一个变量定义的时候,只能有一个。原创 2023-05-13 21:12:59 · 627 阅读 · 0 评论 -
learn_C_deep_9 (汇编角度理解return的含义、const 的各种应用场景、volatile 的基本理解与实验证明)
int arr[n];这里可以看我写的另一篇文章,里面有介绍到。总结:在vs2013(标准C)下直接报错了,但是在gcc(GNU扩展)下,可以。但我们一切向标准看齐,不可以。const只能在定义的时候直接初始化,不能二次赋值。为什么?const关键字的作用是告诉编译器该变量是一个常量,不应该被修改。因此,使用const关键字声明的变量在程序运行期间一旦赋值就不能再被修改。为了让编译器能够实现这个目标,const关键字在编译时会对该变量进行一些优化,使得该变量的值在程序运行期间不可修改。原创 2023-05-07 22:49:00 · 802 阅读 · 1 评论 -
learn_C_deep_8 (循环语法的理解、void的用法以及理解)
在C语言中,void是一种“空类型”,它没有具体的值或大小,因此不能定义为变量类型,也不能用作变量的数据类型。很明显,在vs和gcc编译器中是错误的,禁止运行。我们再用sizeof求一下它所占的空间。很明显,在vs编译器空间大小为0,自然也就不能开辟空间。在gcc编译器下,大小又是多少呢?很明显,在vs编译器空间大小为1,但是在vs编译器上显示大小为0,这不是矛盾嘛?实际上,这是编译对void类型做出的不同解释:1.在vs编译器空间大小为0,自然定义变量也是错误的。原创 2023-05-05 22:38:55 · 614 阅读 · 4 评论 -
learn_C_deep_7 (switch 语句的基本理解、case 的作用、break的作用switch、case 推荐规则)
1.原创 2023-04-27 15:30:33 · 1982 阅读 · 2 评论 -
learn_C_deep_6 (布尔类型、布尔与“零值“、浮点型与“零值“、指针与“零值“的比较)
1.优先使用C90,就是我们之前用的非0为真,0为假。2.一定要使用bool类型,优先使用bool,不推荐BOOL(可移植性较差)。原创 2023-04-23 20:09:11 · 634 阅读 · 0 评论 -
learn_C_deep_5 (温故知新、sigend char a = -128的深度理解、unsigned int类型的写法规范)
在使用补码表示法时,10000000表示的是负数,而不是-0。这是因为在补码表示法中,正数的二进制表示与原码表示相同,负数的二进制表示则为其绝对值的原码取反再加1。因此,10000000的补码为11111111(取反)+ 1=10000000,表示的是-128,而不是-0。在补码表示法中,-0没有意义,并且不存在对应的二进制表示。因为0的原码、反码和补码都是00000000,而且补码中没有正零和负零之分。因此,在补码表示法中,所有二进制表示的最高位(符号位)为1的二进制数都表示负数,而不表示-0。原创 2023-04-22 20:35:53 · 505 阅读 · 5 评论 -
learn_C_deep_4 (类型和变量命名、sizeof(int) *p表示什么意思、原码、反码和补码的概念、计算机中数据计算时,为什么要转为二级制、unsigned和signed关键字)
类型和变量命名。原创 2023-04-20 15:37:59 · 258 阅读 · 0 评论 -
learn_C_deep_3 (最名不符实的关键字 - static、static关键字总结、基本数据类型、最冤枉的关键字 - sizeof)
1. 全局变量:使用 `static` 关键字修饰变量时,它的作用域被限定在声明该变量的源文件内,不会被其他源文件所直接使用。此外,静态变量的生命周期和程序的执行周期相同,它只会在程序初次运行时被初始化,以后每次函数调用都会记住上一次的值,不会被销毁。2. 静态函数: 使用 `static` 关键字定义函数时,该函数的作用域被限定在声明该函数的源文件内部,其它源文件无法直接访问该函数。这在一些小的项目中很有用,可以减少命名冲突和全局污染的问题。原创 2023-04-17 17:20:37 · 460 阅读 · 1 评论 -
learn_C_deep_2 (作用域和生命周期、局部变量和全局变量、最宽宏大量的关键字 - auto、最快的关键字 - register)
需要注意的是,由于寄存器是CPU内部的缓存,它的容量非常有限,因此在使用register关键字时,应该权衡使用寄存器和使用内存之间的差异,并根据实际情况进行适当的选择,以达到最优的执行效率。在 C 语言中,auto 关键字被用来显式声明具有自动存储类型的变量,也就是说通过使用 auto 关键字声明的变量,在函数内部都具有自动存储类型,它们的生命周期与函数的调用周期相同。由于寄存器的访问速度非常快,因此将变量存储在寄存器中,可以提高程序的执行效率,特别是对于需要频繁访问的变量,效果更加明显。原创 2023-04-16 22:29:19 · 616 阅读 · 2 评论 -
learn_C_deep_1 (C程序补充知识、变量的声明和定义、声明和定义的区别)
在计算机编程中,变量是指一个名称代表的内存位置,用于存储程序运行时需要的数据。变量可以存储各种类型的数据,例如数字、字符串、布尔值等。变量的名称由程序员定义,并根据需要指定变量的数据类型。变量的数据类型决定了变量可以存储的数据类型和占用的内存空间大小。例如,整数类型的变量可以存储整数值,而字符串类型的变量可以存储字符串值。在程序运行过程中,程序可以不断地给变量赋值,并将变量的值用于计算、比较或其他操作。变量的值可以改变,但其内存位置不变。原创 2023-04-15 20:20:54 · 415 阅读 · 2 评论 -
初识关键字
c90(c89)标准中关键字的数量是32个,而c99中又再增加了5个关键字,但是由于目前我们的编译器对c99的兼容性并不好,所以我们仍然使用默认的c90标准,即有32个关键字。本期笨笨小胡巴分享结束啦,我们下期见,bye-bye!原创 2023-04-02 14:49:21 · 119 阅读 · 3 评论