c语言学习
文章平均质量分 65
c语言学习笔记
leaoleao沄
这个作者很懒,什么都没留下…
展开
-
指针数组复习
++p,*(++p) 表达式的值为*(p+1),副作用p自增;++*p,++(*p) 表达式的值为*p+1,副作用*p自增;(*p)++ 表达式的值为*p,副作用*p自增;指针的好处,值传递不够改变实参的值,而通过传递实参的地址,可以通过指针改变实参的值;1、指针的算数运算,当指针指向数组元素时,可以通过指针的算术运算访问数组的其他元素;*p++,*(P++) 表达式的值*p,副作用p自增;两个指针相减(指针的比较运算,两个数组指向同一数组元素)原创 2024-03-05 15:59:25 · 246 阅读 · 0 评论 -
c语言数组空间
没有专门的空间来存data,data的值只是一个标签,不占用内存空间。//有些不提供该函数,无库函数支撑;2、假设设计了一个0x20008000的地址位置上,向这个位置填入0x12345678的值;char修饰访问空间一个字节一个字节访问,*p存地址标识*p的大小取决于操作系统位数;申请5个char的基本类型,用data数组名来标记第一个元素的首地址;函数的参数传递行为:函数的数组空间传递,只能传递首地址;2、地址访问行为:一个数组一个数组的访问;1、对数组名获取他的地址,值还是数组空间首地址的值;原创 2023-07-24 20:08:16 · 118 阅读 · 0 评论 -
C语言二维指针
所有指针,都可以理解为指向一片连续空间,只是这个连续的空间,究竟时几个(1-N),约定个数(数组),约定结束标志(NULL);c语言种main的参数传递,int argc,char *argv[];指针本意:一个地址的描述,描述了地址指向空间的访问方式;存储的是一个地址,这个地址可以无穷的访问,访问多少具体看指向空间的属性决定;把物理地址放到连续逻辑地址上再用一个指针来指向该连续的逻辑地址;p[10]//寻址方式;1、二维指针的逻辑意义。2、多维数组的逻辑意义。原创 2023-07-31 21:31:28 · 67 阅读 · 0 评论 -
c语言数字字符编码
数字(\101八进制数字,数字只能0-7);'ascll码中的符号',‘1’,‘a',ascll(1b 0-255 低127个状态[0-6bit]给了8bit只用了7bit)字符减去‘0’,可以得数字,因为在ascll表中数字字符是连续排列的;0x20 --0x7f 可见字符,用%c看得见,//char a = 32/' '/0x20;大写字母在小写字母前面,大写字符小于小写字符,排序中,从小到大,大写字符在前,优先级高;(解决中文乱码bug,windows是国标码,Linux用的是utf-8)原创 2023-07-19 19:13:48 · 575 阅读 · 0 评论 -
c语言的字符空间
char *strcpy(char *dest//目标地址,const *src//源地址){漏洞心脏流血 strcpy函数漏洞;如果源码超过目标函数导致内存越写;工程中不能用strcpy;字符空间:常量行为:字符串;要存东西先考虑是不是字符空间;}//strcpy的内部结构;字符空间,只要是字符空间就一定有一个结束标志0;减一拷贝的时候留一个空间来加0;1、数组无法是实现越界检测;dest多不担心越界问题;printf(%s,a)字符输出;涉及到写入空间的,建议加上个数;strlen 的函数内部结构;原创 2023-07-25 12:00:36 · 42 阅读 · 0 评论 -
水仙花数c语言
水仙花数指一个三位数,它每个位上的数字的3次幂之和等于它本身。1、三位水仙花数4个:153,370,371,407;数据类型,结构体,共用体,大驼峰命名法。函数里的局部变量:下划线法定义;函数名,小驼峰命名;2、c语言命名规则:参考。原创 2023-07-24 00:12:31 · 44 阅读 · 0 评论 -
C语言指针
申请5个char的基本类型,用data数组名来标记这五个类型的首地址,data的值无法标记5个空间,data的值仅仅是一个标签,不占用空间;char *p2="abc",常量空间中abc不会单独开辟,只是多开了一个p2,p2存入的是abc的首地址,p1==p2;//指针变量,保存地址的容器,大小和计算机操作系统位数有关,值是可以变的,指针的地址不可以变;//const 只读的,一个char一个char的走,是一个字符串;这个容器的名称(标识),在哪(地址),存什么(值),干什么(类型);原创 2023-07-25 21:13:42 · 22 阅读 · 0 评论 -
c语言内存地址
地址[n] 以地址的值作为首地址,偏移n个单位位置,访问里面对应的值;地址的访问,拿到这个地址,取出地址的值,用这个值去访问对应的空间;*地址 以地址的值作为首地址,偏移0个位置,访问里面对应的值;这个地址的运算操作特殊(访问时安照对象大小进行的);&变量名 通过查表,把变量名对应的地址取出来;用*的标点符号,把变量名升级为地址类型;2、通过一个绝对的地址访问同样的内存;地址 + 1 =地址值 =1个单位;用多大容量的区域来保存这个地址的值;只要使用地址要考虑这个地址的范围;原创 2023-07-24 12:19:59 · 500 阅读 · 0 评论 -
猜数字游戏
4、浮点数中float类型变量i与零比较的语句(原则上不能进行直接相等的比较,采用范围比较,范围逼近);s = “123”(把123的首地址赋值给s);第二种,不管文件编码行为,在编译时,生成可执行文件的时候,告知编译,将可执行文件的编码设置为一致。gcc -o build xxx.c build的可执行文件和源文件的中文编码一致;“”双引号是空间首地址,内存中有一段只读的区域,作为空间首地址,保证程序输出终端的解码行为和可执行文件里保存的中文编码是一致的;第一种,源文件的中文编码和终端解码一致;原创 2023-07-23 16:11:54 · 26 阅读 · 0 评论 -
算数运算&位运算&逻辑运算
0x8000000表示的是一个32位二进制数,转换为二进制为10000000000000000000000000000000。左移一次,相当于*2(1000 0000 *2会溢出导致结果为0)无符号数的移动空位填0,有符号的移动右移空位为符号位;先后关系的要求:A为真,B才执行,A为假,B不执行;如果是无符号数,除法结果变为正数;右移的空位,根据这段内存中是否有符号;交换两个数:a=a^b;当原始数据比较大的时候,可以分块进行加密解密;A || B:A真,B不执行;乘除注意范围,无符号和有符号;原创 2023-07-19 21:52:05 · 201 阅读 · 0 评论 -
c语言函数库
6、strstr(const char *haystack,const char *needle)在haystack中茶查找一次needle的位置,不包括终止符'\0';char data[5] sizeof(data){在关键字sizeof中传递的是数组标识},在函数中data只传首地址;2、给一个二维数组int data[3][4],用一个指针变量来保存数组名;//三行四列,data + 1和data之间是加了4个int;只表示接收到了一个地址的值而已,便于子函数接收主函数传递的空间;原创 2023-08-06 13:50:48 · 23 阅读 · 0 评论 -
计算器案例c语言
char *p[10]:数组,以一个指针变量为对象,并以10个该对象组成的数组,p在64位操作系统中占80byte;char(*p1)[10]:p1存了一个地址,以十个char来操作这个地址,p1在64位中占8byte;s:数组,10个元素,每个是地址,大小 指向空间怎么操作;(int)函数的方式来操作,输入参数是int,返回值int;每个地址是指向函数的地址;函数地址 int void。signal :函数名:输入:1 int 2 函数地址(输入为int,返回值为void的函数)原创 2023-08-06 19:43:35 · 35 阅读 · 0 评论 -
结构体与共用体封装方式
告知编译器,有一个新的类型(新的容器)不占空间;为了能够访问多个类型组合的空间,使得其局部传递性,拷贝性,自定义封装类型,从封装的行为上,分为两种行为,结构体,共同体;定义一个叫做len_t的int类型的别名;1、数组(相同数据类型的组合)在c语言中称之为概念,不认为是类型,不具备传递性,拷贝性;共用体:union 包名 变量名(共用体共用空间的基地址,大小是成员的最大值);定义一个叫做len_t的int类型的变量;结构体包:先定义类型再分配空间,最后使用;typedef 语法:(类型别名)原创 2023-07-13 20:51:18 · 92 阅读 · 1 评论 -
结构体与共用体详解
unsigned int b1:4(分配空间4位)这个语法,可以控制寄存器位的数据;在原子类型基础上,若能将更多的类型打包成一个类型,那么访问和程序设计时,将会更容易,根据打包形势分成结构体(struct)和共用体(union)。c语言提供数组的概念来封装具有多个相同数据类型的空间,但是c语言不承认有数组类型。(默认规则)结构体 为了提高内存访问效率,在软件编译时,会引入字节对齐的规则;共用体内存共用,先定义的会被后定义的覆盖;1、结构体中最大的基本数据类型作为对齐标准;三、共用体封装方式,访问方法;原创 2023-07-18 19:15:52 · 86 阅读 · 1 评论 -
c primer plus note_chapterOne
6、编译器把源代码文件转化为中间代码,链接器把中间代码和其它代码合并,把结果放在目标代码文件中(此时不能之间运行),目标文件代码缺失启动代码(startup code,启动代码是程序和操作系统之间的接口),可以在MS windows或linux系统下运行IBM PC兼容机。目标代码还缺少函数库,所以链接器是把编写的目标代码,系统标准启动码和库代码合成一个文件,即可执行文件;//clang这一点的用法和GCC相同;定义程序目标,设计程序,编写程序,编译程序,运行程序,测试和调试程序,维护和修改程序;原创 2023-08-11 11:57:06 · 35 阅读 · 0 评论 -
编译器项目————只实现到文法分析
2、运算:ADD,SUB,MUL(乘),DIV(除),MOD(取模)//,OR(或),xOR(异或),AND(与),SHL(左移),SHR(右移),IQ(等),NE(不等),LT(小于),LE(小于等于),GT(大于),GE(大于等于)以0为起始状态,通过getchar----(i)--》假设进入标识符状态,继续读n,读t,认为是标识符,遇到空格结束回到状态0,遇到等号进入赋值状态,再遇到等号进入等号状态,空格回到状态0;语义(semantic):语法背后实际的含义;以乘法表达式的规则进行匹配;原创 2023-10-19 18:21:42 · 74 阅读 · 0 评论 -
c primer plus_chapter_four——字符串和格式化输入/输出
0 数值格式:用0代替空格填充字段宽度,整数格式:有- 或指定 精度,则忽略该标记,”%010d" ,,"%0.83f"%G 根据值不同,自动选择%f、%E、%E格式用于指数小于-4或者大于或等于精度时。#define a 1 //程序中所有的a都被替换成1;//40表示元素数量,char表示访问类型;原创 2023-11-12 21:18:06 · 124 阅读 · 0 评论 -
c语言复习_1
指针可以作为数组长度:在C和C++中,如果我们有一个指针"p"指向数组的第一个元素,并且我们知道数组中元素的类型大小,那么我们可以通过计算"p + n"来获取数组的第n个元素,其中n是数组长度。(2):根据索引查找值,(O(n),平均遍历n/4个元素,单链表平均遍历n/2)//双链表记录索引值,比中间值大就逆序遍历,小则顺序遍历;先比较两个链表的第一个元素确定第一个位置,再把第二个元素和另一个链表的下一个元素或者本结点的下一个元素比较,当一个链表结束后直接在尾结点接入另一个链表剩下的元素;原创 2023-10-08 20:00:46 · 104 阅读 · 0 评论 -
c语言的函数上设计思想
第九行可能打印出不是hello world的信息,常量字符串 赋值给局部变量数组,函数返回局部变量消失,常量字符串依然存在,用等号给空地址赋值,虽然该地址可以赋值给str,但是该地址已经随着函数返回而成为随机地址,里面存的值已经不确定了;*a =200//下级函数a中存的是上级函数中a的地址,而*a直接通过该地址访问到了上级的a,通过赋值改变上级函数中a的值;p是局部变量,第三行用malloc申请的堆空间的值为局部变量赋值,函数返回后局部变量消失,而堆空间未消失,没有回收导致了内存泄漏;原创 2023-09-03 20:48:34 · 41 阅读 · 0 评论 -
c语言经典算法—二分查找,冒泡,选择,插入,归并,快排,堆排
工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后再从剩余未排序中继续寻找最小(大)元素,然后放到已排序序列的末尾,以此类推,直到所有元素均排序完毕;交换次数:((n-1)+(n-2)+...+1 = (n(n-1))/2)原数组逆序(比较次数,(n-1)+(n-2)+...+1 = (n(n-1))/2);(比较次数:大于交换的次数,小于(n(n-1))/2)最坏情况原数组逆序(比较次数(n-1)+(n-2)+...+1 = (n(n-1))/2)原创 2023-11-04 12:16:48 · 601 阅读 · 0 评论 -
c语言内存分段管理
//int * *p中,int* 存了a的地址,*p存了a的指针变量里存的地址;栈内不仅保存了函数的局部变量,也保存了函数的返回信息,如果越界访问并修改这些空间就会出现段错误(函数回调上一个函数会有一个保护现场的地址指针);//(int *相当于函数返回值)来修改上级函数的值,在不同函数里定义相同的名称的局部变量,用了static后会升级其生命周期,并且不会冲突,在编译的时候会给这两个相同的变量不同的标识符;原创 2023-08-25 17:57:24 · 57 阅读 · 0 评论 -
c语言文件处理,错误处理
在读和写的过程中我们希望读和写是同时进行的,但是只用“wb”加fwrite读写入(序列化)加上“rb”和fread(反序列化)这样涉及到 操作系统从内核态转化到用户态的变化,导致硬件应用不合理,所以使用“wb+”进行读写,但是因为序列化已经到文件的末尾了,此时的指针指向的是字符流的末尾,反序列化的时候要思考怎么把指针移到字符流的起始位置,这就需要用到文件定位;"A"-------append,追加(不要求文件存在,如果文件存在,不会清空原文件的内容)不同操作系统表示换行不同,Linux----'\n';原创 2023-10-13 13:13:16 · 45 阅读 · 0 评论 -
c语言经典面试题
传统上,主函数定义了一个int空间,子函数就必须接收一个int * 的变量,通过这个变量,反向更新,将主函数中的int空间的值进行修改;int a[3][4] = {1,2,3.....}//二维数组看后面那个来操作空间,a是4个int4个int地访问地址;那么,如果子函数中想更新一个int * 的值,必须传递一个int * * 的变量来达到同样的效果;&a + 1,是一个数组一个数组加,指针的地址会到a数组后面,(*p)[4]//存的是地址,4个int4个int地访问地址;原创 2023-09-05 20:52:55 · 32 阅读 · 0 评论 -
c primer plus_Chapter_There数据和c
存在一个指数部分是最小值,即全部可用位来表示最小尾数值,(该数字是float类型能用的全部精度表示的最小值),现在把它除以二,通常会减小指数部分,但指数已经是最小值,计算机只能把尾数部分右移,空出一个二进制位,丢弃最后一个二进制数,例如0.1234E-10除以10,得到的结果是0.0123E-10。printf的缓冲区,当缓冲区(buffer)满,遇到换行字符或需要输入的时候,就可以把缓冲区的内容发送到屏幕,(该行为叫刷新缓冲区),旧式编译器遇到scanf不会刷新缓冲区,可以利用换行符来刷新;原创 2023-08-21 14:02:28 · 47 阅读 · 0 评论 -
c primer plus_ChapterTwo
设计程序:定义3个变量,用scanf接收,设计一个转化函数,获取当前时间戳,利用tm结构体,遍历每一年判断润,平年,减去输入的day,加上今年目前的nday,累加之前的day即可;4、main(函数名),int,function(函数),char,=(运算符)哪些是c语言的关键字?1、printf ("a%d\n")//a为实际参数;程序目标:接收输入的日期并输出到今天的天数;5、编写一个程序把你的年龄换算成天数?形式参数:函数中用于储值的变量;实际参数:传递给函数的特定值;违反了组成语句或程序的规则;原创 2023-08-11 22:28:25 · 32 阅读 · 0 评论 -
c程序设计语言笔记
(1)数据传输指令(CPU+ARM),数据处理指令(运算),程序控制指令(控制执行顺序)、输入输出指令(外部设备+主机之间)、硬件管理指令(硬件管理)、特殊功能(多媒体,DSP,通信,图形渲染等)。4、运算器:ALU(算数逻辑单元),进行算数运算和逻辑运算。5、软件=程序+程序运行所需要的数据+开发+使用+维护所需要的文档的集合。需求分析+概要设计+详细设计+编制程序+软件测试+软件维护=软件工程。1、组成:运算器,控制器,存储器,输入设备,输出设备。2、计算机工作原理:取指令,分析指令,执行指令。原创 2023-05-11 09:53:30 · 71 阅读 · 1 评论