![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c加强与提升
文章平均质量分 77
1
打酱油的;
这个作者很懒,什么都没留下…
展开
-
树和二叉树
由一个或多个(n≥0)结点组成的有限集合T,有且仅有一个结点称为根(root),当n>1时,其余的结点分为m(m≥0)个互不相交的有限集合T1,T2,…,Tm。每个集合本身又是棵树,被称作这个根的子树。原创 2023-02-03 20:13:39 · 1150 阅读 · 1 评论 -
static和全局变量
static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。但是对于c语言初学者,static由于使用灵活,并不容易掌握。本文就static在c语言中的应用进行总结,供参考使用。错漏之处,请不吝指正。全局变量:进入每个函数,重新在栈中开辟内存,供给使用,函数结束后销毁。static做全局:周期在整个程序运行完,每个函数进入后不会新开辟内存,就初始的放在静态区,可以读写,更改。做局部变量:作用域在函数内部,但是函数结束不销毁,放在静态区,下一次调用函数时,保留原值。原创 2023-02-23 13:46:49 · 98 阅读 · 0 评论 -
预处理和宏
1. 无参数的宏定义(宏常量)如果在程序中大量使用到了100这个值,那么为了方便管理,我们可以将其定义为:但是如果我们使用num定义一个数组,在不支持c99标准的编译器上是不支持的,因为num不是一个编译器常量,如果想得到了一个编译器常量,那么可以使用:在编译预处理时,将程序中在该语句以后出现的所有的num都用100代替。这种方法使用户能以一个简单的名字代替一个长的字符串,在预编译时将宏名替换成字符串的过程称为“宏展开。宏定义,只在宏定义的文件中起作用。原创 2023-02-10 15:44:46 · 476 阅读 · 1 评论 -
函数指针和回调函数
通过函数类型定义的变量是不能够直接执行,因为没有函数体。只能通过类型定义一个函数指针指向某一个具体函数,才能调用。//错误,不能直接调用,只描述了函数类型,但是并没有定义函数体,没有函数体无法调用。C语言中的函数有自己特定的类型。一个函数在编译时被分配一个入口地址,这个地址就称为函数的指针,//1. 先定义函数类型,通过类型定义指针。//正确,指向有函数体的函数入口地址。//3. 直接定义函数指针变量。//2. 定义函数指针类型。// f 为函数类型。// p 为函数类型。原创 2023-01-14 22:19:32 · 434 阅读 · 0 评论 -
链表及其综合应用
链表是一种常用的数据结构,它通过指针将一些列数据结点,连接成一个数据链。建立链表时无需预先知道数据总量的,可以随机的分配空间,可以高效的在链表中的任意位置实时插入或删除数据。链表:无需一次性分配一块连续的存储区域,只需分配n块节点存储区域,通过指针建立关系。缺点:1) 需要分配一块连续的存储区域(很大区域,有可能分配失败)数据域用来存储数据,指针域用于建立与下一个结点的联系。链表的开销,主要是访问顺序性和组织链的空间损失。数组:一次性分配一块连续的存储区域。优点:1) 不需要一块连续的存储区域。原创 2022-12-25 22:21:06 · 476 阅读 · 0 评论 -
文件相关操作
当我们想操作一个文件的时候,让操作系统帮我们打开文件,操作系统把我们指定要打开文件的信息保存起来,并且返回给我们一个指针指向文件的信息。当对文件使用文本方式打开的时候,读写的windows文件中的换行符\r\n会被替换成\n读到内存中,当在windows下写入文件的时候,\n被替换成\r\n再写入文件。它们并未做任何改变。流是一个动态的概念,可以将一个字节形象地比喻成一滴水,字节在设备、文件和程序之间的传输就是流,类似于水在管道中的传输,可以看出,流是对输入输出源的一种抽象,也是对传输信息的一种抽象。原创 2023-02-06 10:30:56 · 374 阅读 · 1 评论 -
数组进阶提高(指针数组与数组指针)
在讨论多维数组之前,我们还需要学习很多关于一维数组的知识。首先让我们学习一个概念。考虑下面这些声明:int a;int b[10];我们把a称作标量,因为它是个单一的值,这个变量是的类型是一个整数。我们把b称作数组,因为它是一些值的集合。下标和数名一起使用,用于标识该集合中某个特定的值。例如,b[0]表示数组b的第1个值,b[4]表示第5个值。每个值都是一个特定的标量。那么问题是b的类型是什么?它所表示的又是什么?一个合乎逻辑的答案是它表示整个数组,但事实并非如此。在C中,在几乎所有数组名的表达式中,数组名原创 2022-07-01 01:07:29 · 213 阅读 · 0 评论 -
位的高阶运算
可以使用C对变量中的个别位进行操作。您可能对人们想这样做的原因感到奇怪。这种能力有时确实是必须的,或者至少是有用的。C提供位的逻辑运算符和移位运算符。在以下例子中,我们将使用二进制计数法写出值,以便您可以了解对位发生的操作。在一个实际程序中,您可以使用一般的形式的整数变量或常量。例如不适用00011001的形式,而写为25或者031或者0x19.在我们的例子中,我们将使用8位数字,从左到右,每位的编号是7到0。4个位运算符用于整型数据,包括char.将这些位运算符成为位运算的原因是它们对每位进行操作,而不影原创 2022-06-29 21:39:29 · 216 阅读 · 0 评论 -
二级指针与多级指针
这里让我们花点时间来看一个例子,揭开这个即将开始的序幕。考虑下面这些声明:int a = 12;int *b = &a;它们如下图进行内存分配: 假定我们又有了第3个变量,名叫c,并用下面这条语句对它进行初始化:c = &b;它在内存中的大概模样大致如下: 问题是:c的类型是什么?显然它是一个指针,但它所指向的是什么?变量b是一个“指向整型的指针”,所以任何指向b的类型必须是指向“指向整型的指针”的指针,更通俗地说,是一个指针的指针。它合法吗?是的!指针变量和其他变量一样,占据内存中某个特定的位置,所以用&原创 2022-06-28 15:18:26 · 404 阅读 · 0 评论 -
const用法精讲
类似结构体函数参数通过指针来传递可以节省空间 但是存在一种情况,指针容易把原来的变量修改了,形成误操作,加const防止误操作,下面的p->age=100;会引起报错(但是可以间接修改)//const修饰变量void test01(){const int i = 0;//i = 100; //错误,只读变量初始化之后不能修改//a. 定义const变量最好初始化const int j;//j = 100; //错误,不能再次赋值//b. c语言的const是一个只读变量,并不是一个常量,可通过指针间接修改c原创 2022-06-27 18:46:28 · 340 阅读 · 0 评论 -
字符串操作
字符串是以0或者'\0'结尾的字符数组,(数字0和字符'\0'等价),字符数组只能初始化5个字符,当输出的时候,从开始位置直到找到0结束字符数组部分初始化,剩余填0如果以字符串初始化,那么编译器默认会在字符串尾部添加'\0'说明:sizeof计算数组大小,数组包含'\0'字符strlen计算字符串的长度,到'\0'结束示例代码://字符串基本操作//字符串是以0或者'\0'结尾的字符数组,(数字0和字符'\0'等价)void test01(){//字符数组只能初始化5个字符,当输出的时候,从开始位置直到找到原创 2022-06-24 15:11:55 · 710 阅读 · 0 评论 -
指针强化与提高
指针是一种数据类型,占用内存空间,用来保存内存地址。void test01(){int* p1 = 0x1234;int*** p2 = 0x1111;printf("p1 size:%d\n",sizeof(p1));printf("p2 size:%d\n",sizeof(p2));//指针是变量,指针本身也占内存空间,指针也可以被赋值int a = 10;p1 = &a;printf("p1 address:%p\n", &p1);printf("p1 address:%p\n", p1);print原创 2022-06-23 13:22:48 · 335 阅读 · 0 评论 -
栈的生长方向和内存生长方向
小端对齐 :低字节放在低地址,高字节放在高地址(多)小端对齐 :高字节放在低地址,低字节放在高地址(服务器)示例代码://1. 栈的生长方向void test01(){int a = 10;int b = 20;int c = 30;int d = 40;printf("a = %d\n", &a);printf("b = %d\n", &b);printf("c = %d\n", &c);printf("d = %d\n", &d);//a的地址大于b的地址,故而生长方向向下}//2. 内存生长方向(小端原创 2022-06-19 20:04:06 · 3560 阅读 · 1 评论 -
函数调用模型
概念:预编译做了宏替换注意事项:保存运算完整性(要注意符号结合)依旧要以原来优先级为先!!!!! 使用场景:将短小的函数封装为宏函数 以空间换时间,在一定程度上会比普通函数效率高(普通函数会有入栈和出栈的时间开销) 栈(stack)是现代计算机程序里最为重要的概念之一,几乎每一个程序都使用了栈,没有栈就没有函数,没有局部变量,也就没有我们如今能见到的所有计算机的语言。在解释为什么栈如此重要之前,我们先了解一下传统的栈的定义:在经典的计算机科学中,栈被定义为一个特殊的容器,用户可以将数据压入栈中(入栈,pu原创 2022-06-18 23:16:53 · 135 阅读 · 0 评论 -
大话内存四区
运行之前我们要想执行我们编写的c程序,那么第一步需要对这个程序进行编译。当我们编译完成生成可执行文件之后,我们通过在linux下size命令可以查看一个可执行二进制文件基本情况: 通过上图可以得知,在没有运行程序前,也就是说程序没有加载到内存前,可执行程序内部已经分好3段信息,分别为代码区(text)、数据区(data)和未初始化数据区(bss)3 个部分(有些人直接把data和bss合起来叫做静态区或全局区)。 1.代码区存放 CPU 执行的机器指令。通常代码区是可共享的(即另外的执行程序可原创 2022-06-18 14:15:17 · 343 阅读 · 0 评论 -
变量
既能读又能写的内存对象,称为变量;若一旦初始化后不能修改的对象则称为常量。变量定义形式: 类型 标识符, 标识符, … , 标识符3.修改变量的两种方式: void test(){int a = 10;//1. 直接修改a = 20;printf("直接修改,a:%d\n",a);//2. 间接修改int* p = &a;*p = 30;printf("间接修改,a:%d\n", a);}这俩种写法完全等效 : (*p).a,和p->a完全等效 ->相当于取值引用,->是指针结构体变量取内容...原创 2022-06-17 15:15:54 · 73 阅读 · 0 评论 -
数据类型
什么是数据类型?为什么需要数据类型?数据类型是为了更好进行内存的管理,让编译器能确定分配多少内存。我们现实生活中,狗是狗,鸟是鸟等等,每一种事物都有自己的类型,那么程序中使用数据类型也是来源于生活。当我们给狗分配内存的时候,也就相当于给狗建造狗窝,给鸟分配内存的时候,也就是给鸟建造一个鸟窝,我们可以给他们各自建造一个别墅,但是会造成内存的浪费,不能很好的利用内存空间。我们在想,如果给鸟分配内存,只需要鸟窝大小的空间就够了,如果给狗分配内存,那么也只需要狗窝大小的内存,而不是给鸟和狗都分配一座别墅,造成内存的原创 2022-06-16 22:42:15 · 301 阅读 · 1 评论 -
变量与指针
1原创 2022-06-16 20:06:16 · 78 阅读 · 0 评论