C学习笔记
文章平均质量分 60
千度vea
读书人
展开
-
C语言笔记(28)柔性数组及文本相关知识
如有整数1000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节。3.包含柔性数组成员的结构用malloc()函数进行内存的动态分配没并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。结论:因为有缓冲区的存在,C语言在操作文件时,需要做刷新缓冲区或在文件操作结束时关闭文件,若不做可能导致读写文件的问题。数据文件:文件的内容不一定是程序,二十程序运行时的读写的数据,比如程序运行需要从中读取数据的文件或者输出内容的文件。原创 2023-12-26 13:33:29 · 969 阅读 · 0 评论 -
C语言笔记(27)动态内存管理等知识
有时我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的内存,我们一定会对内存的代下做灵活的调整。函数功能是为num个大小为size的元素开辟出一块空间,并且把空间的每一个字节初始化为0,与函数malloc的区别在于calloc会返回地址之前把申请的空间的每个字节初始化为0.返回值是void*,所以malloc函数并不知道,开辟空间的类型,具体在使用的时候使用者自己来决定。如果参数ptr只想的空间不是动态开辟的,那free函数的行是未定义的。free函数用来释放动态开辟的内存。原创 2023-12-24 21:37:25 · 426 阅读 · 0 评论 -
C语言笔记(26)位段、枚举、联合等知识
联合:联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间,所以联合体也叫共用体。4.当一个结构包含两个位段,第二个位段成员比较大,无法容纳第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。1.位段空间上是按照需要以4个字节(int)或1个字节(char)的方式来开辟的。总结:跟结构相比,位段可以达到同样的效果,但可以很好节省空间,但有跨平台问题存在。2.位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。如:struct A。原创 2023-12-24 20:24:44 · 409 阅读 · 0 评论 -
C语言笔记(25)结构体及相关知识
4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处。结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。原因:函数传参是,参数是需要压栈,会有时间与空间上的系统开销,若传递一个结构体对象时,结构体过大,参数压栈系统开销较大,所以会导致性能下降。不是所有的硬件平台都能访问任何地址上的任意数据的,某些硬件平台只是在某写地址处取得某些特定数据类据,否则抛出硬件异常。原因在于,为了访问对齐的内存,处理器需要做两次内存访问,而对齐的内存访问仅需要一次访问。原创 2023-12-23 22:36:34 · 391 阅读 · 0 评论 -
C语言笔记(24)字符分类函数及相关零碎知识
\f’ 换行'\n',回车'\r',制表符'\t',或垂直制表符'\v'memcpy函数时不用来处理重叠的内存之间的数据拷贝的,可以使用memmove函数来实现。isprint 任何可打印字符,包括图形字符与空白字符。isxdigit 十六进制,包括所有10进制,小写大写a~F。isalnum 字母/数字,a~z, A~Z, 0~9。isalpha 字母a~z/A~Z。ispunct 标点符号。结果:××××× zhang。原创 2023-12-23 13:56:31 · 306 阅读 · 0 评论 -
C语言笔记(23)冒泡排序与strcopy等知识
如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是有该函数的实现方直接调用,而是在特定的事情或条件发生时有另外的一方调用的,用于对该事件或条件进行相应。strlen可以求字符串长度,因为遇到“\0”就会停止,但不可以用来求字符,因为字符没有“\0”作为结束标志,strlen不会停止,存的是随机值。//void*时无具体类型的指针,所以不能解引用操作,也不能±整数。//name数组名是地址,地址是一个常量值,不能被赋值。原创 2023-12-22 22:14:20 · 344 阅读 · 0 评论 -
C语言笔记(22)二维数组和一些零碎知识
该函数指针指向的函数参数是int,返回类型是void,signal函数返回类型也是一个函数指针,该函数指针指向的函数参数是int,返回类型是void。以上代码是一次函数申明声明,声明的signal函数第一个参数类型是int,第二个参数类型是函数指针。p是指向数组的,*p其实就相当于数组名,有是数组首元素的地址。2.&数组名,这里的数组名表示的依然是整个数组所以数组名去除的是整个数组的地址。函数也是有地址的,对于函数来说,&函数名和函数名都是函数的地址。理解一个代码 (*(void(*)())0)()原创 2023-12-20 19:54:05 · 399 阅读 · 0 评论 -
C语言笔记(20)零碎知识
对于整形来说:数据存放内存中其实存放的是补码,原因是在计算机系统中,数据一律用补码来表示和存储。(CPU只有加法器),此外,补码与源码相互转换,其运算过程是相同的,不需要额外的硬件电路。把一个数据的高位字节序的内容存放在低地址处,把低位字节序内容存放在低地址处,把低位字节序内容存放在高地址处,就是大端字节序存储。1.栈区内存的使用习惯是先使用高地址的空间,在使用低地址的空间。p指向的对象是可以通过p来改变的,但是不饿能修改p变量本身的值。p指向的对象不能通过p来改变,但是p变量本身的值是可以改变的。原创 2023-12-10 22:09:11 · 367 阅读 · 0 评论 -
C语言笔记(19)算法和调试相关知识
调试,又称除错,时发现和减少怕计算机程序或电子设备中程序错误的过程,Debug通常称为调试版本,包含调试信息,并且不做任何优化,便于程序员调试程序。因为i是有符号类型,sizeof是无符号类型,当有符号类型负数被转化为无符号类型正数会变成很大的无符号类型正数。release称为发布版本,它往往进行了各种优化,是程序在代码大小和运行速度上都是最优的,方便用户很好使用。p指向的对象是可以通过p来改变的,但是不能修改p变量本身的值。p指向的对象不能通过p来改变,但p变量本身的值是可以改变的。原创 2023-11-01 14:46:31 · 54 阅读 · 0 评论 -
C语言笔记(21)零碎知识
若出现负数,存入内存时E的真实值必须加上一个中间数,对于8位的E,这个中间数时127;E为无符号整数,若为8位,它的取值范围是0~255;int* p[10] 与 int(*p)[10]因为赋给指针的是值,只可以比较,后这是两个不同空间的数组,不可以进行比较。double->E(真实值) +1023(中间值)——>1022。每个元素是指针 *p必须指向的是数组,int类型。float->E(真实值)+127(中间值)——>126存储。//存放整型指针的数组。原创 2023-12-18 20:39:12 · 434 阅读 · 0 评论 -
C语言笔记(18):函数和数组
C语言笔记原创 2023-10-31 22:22:01 · 48 阅读 · 0 评论 -
C语言学习笔记(17):scanf和scanf_s的区别
scanf在读取字符串时并不会检查输入字符串的长度是否小于存储用的字符串的长度,而是直接将所有输入直接写入内存相应位置,而超出长度的内容会直接覆盖在内存原有内容上。一方面,无心的使用者可能因为输入了过长的字符串把内存内容搞乱,造成运行错误;另一方面,有心的攻击者会故意使用很长的字符串进行输入,来覆盖掉你内存的其他部分的内容,将其篡改成恶意代码。这是今天写的代码,vs怎么编译scanf_s都过不去,后来解决了,来做下笔记。scanf_s提供更安全一些的机制 ,以防止溢出,对于%s,%S等,原创 2023-10-24 17:20:12 · 92 阅读 · 0 评论 -
C语言学习笔记(16)循环相关知识
while循环和for循环都是入口条件循环,即在循环的每次迭代之前检查测试条件,所以有可能根本不执行循环体中的内容。C语言中海油出口条件循环,即在循环的每次迭伪代码:是一种用简单的句子表示程序思路的方法,他与计算机语言的形式相对应。do while循环多用于密码的设置,在执行完循环体之后才执行测试条件,所以至少执行循环体一次;(2)测试放在循环的开头,程序可读性更高。不确定循环,指在测试表达式为假之前,预先不知道要执行多少次循环。另一类是技术循环,这类循环再执行循环之前就知道要重复执行多少次。原创 2023-10-23 16:32:33 · 26 阅读 · 0 评论 -
C语言学习笔记(15)printf()与scanf()
最初,pintf()语句把输出发送到一个叫做缓冲区的中间存储区域,然后缓冲区中的内容再不断发送到屏幕上。要想将程序中的scanf弄明白,首先要清楚的是:我们从键盘输入的全部都是字符,比如从键盘输入1 2 3,他表示的是字符'1','2','3'.为什么?操作系统的内核是这样运行的,操作系统在接收键盘数据时把它当成字符来接受,这时就需要用“输入控制符”转化下,将其转为一个十进制数字。对于所有浮点格式,#保证了即使后面没有任何数字,也打印一个小数点字符,对于%g或%G,#防止结果后0被删除。原创 2023-10-23 15:29:27 · 45 阅读 · 0 评论 -
C语言学习笔记(14 )指针原理及相关知识
后来,来了a b 两个人买房,a 选择int类型的房子,地址号001~004正好满足a先生的需求,int类型是4个单元房子合成一个的大房子,属于整形区的房子,买过房子之后,001~004就称为a先生的家。后来a家有急事不在家但需要装修,需要物业进入家中,我们把指针p等价成物业,物业找业主的家是不会找到谁家谁家的,他们只会找到a先生在几栋几单元,从原始地址序列找到a先生的家,a先生家的地址在计算机上我们用&a表示,物业找到a的家,要先知道在那部分的房子,一查是int型的房子,然后直接对接。原创 2023-10-23 14:51:53 · 36 阅读 · 0 评论 -
C语言学习笔记(13)关键字getchar
C库中int getchar(void)从标准输入stdin获取一个字符(一个无符号字符)。返回值:该函数以无符号char强制转换为int的形式返回读取的字符,如果到达文件末尾或发生错误,则返回EOF.scanf可输入不包含空格的字符串,不读回车,空格回车表示输入完毕。getchar一次只能从缓冲区中取走一个字符,包括回车换行。getchar只能读取用户输入缓冲区的一个字符,包括回车。此处getchar()第一次取走a,第二次去走\n。利用此原理可以用getchar来清理缓冲区。运算结果:(输入)a。原创 2023-10-22 22:11:46 · 52 阅读 · 1 评论 -
C语言笔记(12)关键字static
全局变量:具有全局作用域,全局变量只需在一个源文件中定义,就可以作用域所有的源文件(利用关键字extern),这种作用于全局的属性叫做外部连接属性。局部变量:只有局部作用域,在主函数创建下产生,随着主函数结束而销毁。当static修饰全局变量时,会将全局变量的外部链接属性变为内部链接属性,其他.C文件不能再使用,要了解static,我们先来了解没有static修饰下的局部与全局变量特性。,要知道全局变量也是在静态区的,所以在主程序结束时static修饰的局部变量。运行结果:2 2 2 2 2。原创 2023-10-22 21:44:20 · 46 阅读 · 1 评论 -
C语言笔记(11)关键字extern
在main.c文件中调用了func.c文件中的函数func()并在main中运行,在func.c中调用main.c中的全局变量n并且打印。当有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用。存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。注意:extern调用的变量必须是全局变量,其他文件的局部变量是调用不出来的。时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。来得到已定义的变量或函数的引用。2.调用其他文件的变量或函数。原创 2023-10-22 20:49:58 · 46 阅读 · 1 评论 -
C语言笔记(10)关键字(运算符)sizeof
sizeof(arr)求的是数组字节总长度,int是四个字节,arr[ ]有10个元素,总共40个字节。sizeof(arr[0])求的是数组第一个元素的字节长度,每个元素的字节大小都相同。sizeof是一个关键字,是一个编译时运算符,用于判断变量/数据类型的字节大小。可用于获取类、结构、共用体和其他用户自定义数据类型的大小。sizeof第二个作用:算数组等长度。相除可以算出arr数组总长度。原创 2023-10-22 20:06:38 · 83 阅读 · 1 评论 -
C语言学习笔记(9)浮点数与存储方式
当除以一个很小的数时,情况更复杂。以十进制为例,把一个有4位有效数字的数(如0.1234E^-10)除以10,得到0.0123E^-10,随得到结果,但计算过程却损失了元末尾有效位上的数字。C规定,float类型必须至少能表示6位有效数字,且取值范围至少时10^-37~10^37.前一项规定指float类型必须能够表示33.333333的前6位数字,而非精确到小数点后6位数字。现在个人计算机上最常见的设置时:long long占64位,long占32位,short占16位,int占16/32位.原创 2023-10-22 19:48:27 · 100 阅读 · 1 评论 -
C语言学习笔记(8)关键字
在C语言中没有string,要想在C语言中使用字符串,就要在头文件里定义#include<string.h>,而字符串在C++里定义#include<string>,在C/C++中使用字符串也就是定义时不一样,其他都一样。register:指定为寄存器变量,建议编译器将变量储存到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数。extern:指定对应变量为外部变量,即在另外的目标文件中定义,可以认为是约定由另外文件声明对象的一个“引用”。执行顺序1->2->1 (循环2为循环条件)原创 2023-10-22 16:10:40 · 42 阅读 · 1 评论 -
C语言笔记(7)常量以及相关知识
define定义的常量在编译时会被直接替换成其对应值,而const定义的常量在程序运行时会分配内存,并且具有类型信息。定义一个枚举类型,需要用enum关键词,后面跟着枚举类型的名称,以及用{ }括起来一组枚举常量。(2)#define定义的常量没有作用域限制,它在定义之后的整个代码中都有效。常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。5.枚举常量是C语言中的一个基本数据类型,用于定义一组具有离散值的变量,是数据更简洁,易读。(x,y)叫宏的参数,无类型。原创 2023-10-22 10:45:13 · 61 阅读 · 1 评论 -
C语言学习笔记(6)变量及相关知识
C的变量声明:变量声明想编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步编译。标识符定义:在编程语言中,标识符时用户编程时使用的名字,变量、常量、函数、语句都有名字,是用来标识某个实体的一个符号,时对变量名、函数名、标号和其他各拥用户定义的对象名。变量初始化:在C语言中,变量的初始化时在定义变量的同时为其赋予一个初始值。全局变量保存在内存的全局存储区中,占用静态的存储单元,局部变量保存在栈中,只有在所在函数被调用时才动态的位变量分配存储单元。原创 2023-10-21 22:27:09 · 31 阅读 · 1 评论 -
C语言笔记(5)变量、字节及一些基本运行原理
变量a就是我们,我们去酒店居住,服务员肯定要给我们房卡,告诉我们在几栋几单元,这个“房卡”就是变量声明,就是int、char这些东西,它可以告诉我们住在哪些区域,房间的面积有多大,是住在贵宾区,还是普通房间等等。当我们成功登记入住时,在我们使用房子期间,我们就是房子的名字,就像我们在老家盖房子,别人肯定不会去记你房子的编号,他们只会说那是张三家,那是李四的房子,所以a,b等就是内存开辟出空间的名字。机器内存单元本身也是有编号的,只是a和b住了进去,所以这些内存单元暂时称为“a的房间”和“b的房间”。原创 2023-10-21 21:58:11 · 40 阅读 · 1 评论 -
C语言笔记(4)数据类型与数据存放
C语言中的malloc和free,C++中的new和delete均是在堆中进行的。程序中的int float char double称为数据类型,是C语言中标识变量的指令,有了这些指令机器就知道该给这个变量分配几个字节,存在哪个区域。(1)栈(stack)区:由编译器进行管理,自动分配和释放,存放函数调用过程中的各种参数、既不变量、返回值以及函数返回地址。局部变量,即自动变量,保存在栈中,只有在所在函数被调用时才由系统动态在栈中分配临时性单元。显然,C语言中的全局变量和局部变量在内存中是有区别的。原创 2023-10-21 15:34:32 · 58 阅读 · 1 评论 -
C语言笔记(2)相关硬件知识
再获取指令后,CPU在另一个寄存器中存储该指令,并更新第1个寄存器存储下条指令的地址。控制器:CPU的组成部分之一,控制器可以看成计算机的大脑和指挥中心,她通过整合分析相关数据和信息,可以让计算机的各个组成部分有序地完成指令.1.中央处理器:简称CPU,中央处理器包括两部分,即控制器、运算器,其中还包括高速缓冲存储器以及实现它们之间练习的数据、控制的总线。计算机的工作机理就是:如果希望计算机做某些事情,就必须为其提供特殊的指令列表(程序),确切的告诉计算机要做哪些事情以及如何去做。原创 2023-10-20 22:37:45 · 73 阅读 · 0 评论 -
C语言笔记(3)程序运行原理与编译器
这里先来了解机器的运行原理,机器不像我们人或者动物可以去认识万事万物,机器只认识简单的二进制数字,0和1,也就是正负脉冲,那么机器只认识0和1,又是怎样来运行这么多复杂的代码的呢?其次,程序的运行原理,程序是运行在操作系统上的,但想要再操作系统上运行就要在程序头部嵌入一段启动代码,此代码相当于程序和操作系统之间的接口,它包含操作系统所需要加载的信息。,但要注意的是,我们编译的代码是不能被机器识别的,机器智能识别由0和1组成的机器语言。目标文件中的代码是机器语言,并不能执行,它是不完整的程序。原创 2023-10-21 10:15:12 · 61 阅读 · 1 评论 -
C学习笔记(1):C的发展史以及基本概念
简单来说编译器就是一个有一点“秩序”的东西,这点“秩序”是开发者赋予它的,但这点“秩序”不足以让它做更多的事情。想要让它做更多的事情,就要我们给它新的命令,赋予它新的“秩序”,要具体告诉它输入的命令,给了什么变量,该怎样输出。//这行告诉编译器把stdio.h中的内容包含在当前程序中,它提供键盘输入和屏幕输出的支持。//没有该头文件是不能正常输入输出的,scanf() 和 printf()函数也不能使用。//main()是函数主体,函数是所有C程序的组成部分,所有C程序中都有一个主函数。原创 2023-10-20 21:22:40 · 47 阅读 · 1 评论