
c语言学习笔记
哈密瓜刨冰
好好学习,用心分享
展开
-
自定义类型详解:结构体,枚举,联合
3.char 1个字节 4+4+1 但是总空间要是最大对齐数的整倍数,这里最大对齐数是int的4 所以应该是4的整倍数,即12。1.联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。结构的每个成员可以是不同类型的变量。如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整。2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。原创 2023-09-25 11:35:07 · 70 阅读 · 0 评论 -
内存函数简单介绍
函数作用:把从source开始的num个字节的内容拷贝到从destination开始的空间里。返回destination的起始地址。使用方法:假设有一个字符串叫arr,把她从第四个位置开始的六个字节大小的空间的内容都放上x。警示:最好不要用来处理重叠内存,可能会在拷贝过程中发生重叠使得结果不符合预期。相对于memcpy,可以处理重叠内存的拷贝。函数模拟:需要根据源头和目的地的先后位置关系来分类讨论。优点:相比于strcpy,可以处理更多类型的数据。返回值的规律类似于strcpy。以字节为单位设置内存。原创 2023-09-21 16:09:46 · 59 阅读 · 0 评论 -
5.27 数据在内存中的储存
字符储存的时候,存储的是ASCII码值,是整型,所以放在整型家族。1 2 4 4/8 8 4 8 单位是字节。5.27 数据在内存中的储存。有符号无符号 只针对整型家族。C语言直接提供的类型。原创 2023-05-31 17:24:28 · 110 阅读 · 0 评论 -
5.24 初阶测评讲解
后置++ p++解引用是*p 还没++5.24 初阶测评讲解。前一个恒为真,=是赋值。注释会被替换成空格。早期c是没有库函数的。原创 2023-05-30 23:23:02 · 71 阅读 · 0 评论 -
实用调试技巧(2)
int转化为无符号整型,-1会转化为 特别大的整数。断言 宏 括号内为假就报错 assert。左边debug 右边release。Const 左限制*p 右限制p。语法问题,链接期间发生的错误。5.22实用调试技巧(2)返回目标空间的起始地址。原创 2023-05-30 20:30:07 · 61 阅读 · 0 评论 -
指针初阶(2)+初试结构体
但是同样也限于两个相同类型的指针变量,不同类型的指针变量之间比较大小没有任何意义。指针之间的大小比较的意义,表示在内存中他们指向的位置的高低关系。指针变量就是指针变量,不是数组,指针变量大小是4/8个字节,专门用来存放地址的。结构是一些值的集合,这些称为成员变量,结构的每个成员可以是不同类型的变量。数组是一块连续的空间,可以存放1或多个类型相同的数据。联系:数组名是数组首元素地址,数组名==地址==指针。name是数组名字,为地址,所以报错。数组是可以通过指针来访问的。指针数组:存放指针的数组。原创 2023-05-29 17:55:35 · 63 阅读 · 0 评论 -
指针初阶(2)+初试结构体
但是同样也限于两个相同类型的指针变量,不同类型的指针变量之间比较大小没有任何意义。指针之间的大小比较的意义,表示在内存中他们指向的位置的高低关系。指针变量就是指针变量,不是数组,指针变量大小是4/8个字节,专门用来存放地址的。结构是一些值的集合,这些称为成员变量,结构的每个成员可以是不同类型的变量。数组是一块连续的空间,可以存放1或多个类型相同的数据。联系:数组名是数组首元素地址,数组名==地址==指针。name是数组名字,为地址,所以报错。数组是可以通过指针来访问的。指针数组:存放指针的数组。原创 2023-05-29 17:55:04 · 59 阅读 · 0 评论 -
操作符详解(2)
c的整型算术运算总是至少以缺省整型类型的精度进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转化为普通整型,这种转换称为整型提升。算术转换:如果某个操作符各个 操作数属于不同的类型,那么除非其中一个操作数的类型转换为另一个操作数的类型,否则操作就无法进行。逗号表达式:从左向右计算,整个表达式的结果是最后一个表达式的结果。表达式求值:1.表达式在计算过程中有哪些类型转换?a和b都进行了有符号位的提升,因此不等,c不用 进行提升。整型提升是按照变量的数据类型的符号位来提升的。原创 2023-05-14 22:30:23 · 67 阅读 · 0 评论 -
操作符详解(1)
首先不管是正整数还是负整数都可以写出二进制原码:根据正负直接写出的二进制序列就是原码。右移:1.算术右移:右边丢弃,左边补符号位 2.逻辑右移:右边丢弃 ,左边直接补0。②负整数原码反码补码需要计算 符号不变,其他位按位取反-反码 反码 +1-补码。<<左移操作符 >>右移操作符 移动的是二进制 操作数必须为整数。整数在内存中使用的是补码,计算时也是使用补码计算的。除法:1.整数除法(除号的两端都是整数)%:取模操作符的两个操作数必须位整数。最高位是符号位,1为负数,0为正数。原创 2023-05-10 21:43:14 · 58 阅读 · 0 评论 -
三子棋代码
应用多文件的形式写代码 test.c-测试游戏 game.c-游戏函数的实现 game.h-游戏函数的声明。原创 2023-05-07 19:52:43 · 61 阅读 · 0 评论 -
三子棋笔记
2.应用多文件的形式写代码 test.c-测试游戏 game.c-游戏函数的实现 game.h-游戏函数的声明。1.游戏在走的过程中要进行数据的存储,可以使用3*3的二维数组char board[3][3];2.没下棋之前数组中存放空格,可以使用一个初始化函数InitBoard()\t为水平制表符 一般是四个空格,包括打印的内容和空格一共4。打印棋盘DisplayBoard()打印数据 打印分割线。下棋 玩家下棋 playermove()1.游戏不退出,继续玩下一把(循环)判断输赢 iswin。原创 2023-05-07 18:48:39 · 80 阅读 · 0 评论 -
数组(1)
不能用strlen,strlen是用来求字符串长度的,此处为整型数组。字符数组的初始化 可以用这种方法 abc\0。不同数组,先创建的地址大,后创建的地址小。Vs2019 vs2022不支持c99。一维数组的使用 [ ]下标引用操作符。数组传参,本质上传的是首元素地址。下标增长,地址从小到大,从低到高。类型相同的一组数字的集合-数组。地址,在内存中也是连续存放的。汉诺塔问题:b站搜比特大博哥。&arr+1跳过一整个数组。一维数组在内存中连续存放。可以放ASCII码值。可省略行,不能省略列。原创 2023-05-07 13:48:10 · 52 阅读 · 0 评论 -
函数栈帧的创建和销毁
Rep stos把从edi开始的ecx也就是39h次dword(double word,一个word两个字节)全部改成eax的内容也就是0CCCCCCCCh。今天介绍ebp和esp,这两个寄存器中存放的是地址,这两个地址是用来维护栈帧的。把0Ah(也就是10)放在ebp-8的位置,如果不初始化,打印出来随机值“烫烫烫烫”其实就是类似于CCCC的东西的作用。在不同的编译器下函数栈帧的创建和销毁略有差异,大体逻辑是相同的。把ebp-14h的值(20)放到eax里面。Mov 把esp的值给ebp。原创 2023-05-06 23:03:33 · 60 阅读 · 0 评论 -
函数(2)
项目名字右击-属性-常规-配置类型-静态库-生成.lib文件 .lib文件是二进制代码,配合.h食用。链式访问:把一个函数的返回值变成另一个函数的参数,如把strlen的返回值作为printf的参数。可以嵌套调用,不可以嵌套定义:一个函数的定义里面嵌套了另一个函数的定义。对于上面的函数,假设输入1234,栈区是这样开辟空间的,回收是从上到下的。函数的嵌套调用:比如 写了一个函数A,里面调用了函数B。函数递归:程序调用自身-函数自己调用了自己,递推-回归。写一个函数,使得每次调用时,num+1。原创 2023-05-06 18:47:03 · 57 阅读 · 0 评论 -
函数(1)
C语言并不是直接去实现库函数,而是提供了C语言的标准和库函数的约定。函数功能、名字、参数、返回值。库函数的实现一般是编译器去实现的。函数是什么:模块性,负责完成某项特定任务,具备相对独立性。一般会有输入参数并有返回值,提供对过程的分装和对细节的隐藏。C语言把常用的功能进行了封装,封装成一个个函数,提供出来给大家使用。函数调用的两种形式:传值调用和传址调用。写一个函数交换两个整型变量的内容。简单总结C语言常用的库函数。调试方法:调试-窗口-监视。实参在调用时要有确定的值。↑错误,都为奇数不成立。原创 2023-05-06 13:55:17 · 63 阅读 · 0 评论 -
分支和循环语句(3)
时间戳,任何时间都能转化成一串数字,也就是时间戳。time()函数可以返回一个时间戳 time_t类型是long long类型。char是字符类型,字符的本质是字符的ASCII码值,为 整型。所以字符类型在归类的时候是可以划分到整型里面的。srand需要unsigned int类型,可以用强制转换,只需要调用一次srand函数。一个函数内部,可以前跳也可以后跳,不能跨函数。C》猜对了,恭喜你,猜对了,结束游戏。a》猜到了,提醒猜到了,继续猜。b》猜小了,提醒猜小了,继续猜。右击,转到定义,可以查看具体。原创 2023-04-20 12:41:19 · 54 阅读 · 1 评论 -
4.17分支和 循环语句(2)
可以初始化,判断,调整都省略,判断省略意味着判断恒为真,容易死循环,建议不要随便省略。continue跳过本次循环后面部分,直接进入调整部分。同一行打印 system可以执行很多系统命令。strcmp库函数比较两个字符串。4.17分支和 循环语句(2)Int i在括号内为c++写法。《明解C语言》入门书籍推荐。Gitee 仓库取合理名字。一条语句可以不带大括号。Sleep 休息,停住。Do while语句。原创 2023-04-17 22:25:01 · 67 阅读 · 0 评论 -
分支与循环语句(1)
语句:C语言语句可分为以下五类 1.表达式语句 3+5;3.控制语句 4.复合语句大括号括起来 5.空语句;编程好习惯:在最后一个case语句后面加上一条break语句,以防后面还要加case语句忘记加break;转向语句:break语句、goto语句、continue语句、return语句。控制语句用于控制程序的执行流程,以实现程序的各种结构方式。循环执行语句:do while语句、while语句、for语句。条件判断语句也叫分支语句:if语句、switch语句;分支与循环语句(1)笔记。原创 2023-04-15 19:54:16 · 57 阅读 · 0 评论 -
初始C语言(5)
指针变量是用来存放地址的,32位机器上,地址是32个二进制位,这个地址要储存的话是四个字节,大小位四个字节。同理,64位指针大小为8字节。在计算机上,有地址线,物理的电线。高低电平的信号,转换数字信号:1/0;32位的机器,上面有32根地址线。取地址:第一个字节的地址 小端储存(?a==b==c a和b比较,返回1或者0,然后这个1或者0和c比较。数组如果初始化的话,可以不直接指定大小,会根据内容自动分配 大小。程序运行起来,要加载到内存中,也要申请内存空间使用。要学习指针,就得理解内存。原创 2023-04-13 12:43:51 · 68 阅读 · 0 评论 -
初始c语言(4)
Static int a=5,出循环不会销毁//本来一个局部变量是存在栈区的,如果被static修饰,就存到静态区了。改变了变量的存储类型(位置),使得静态变量生命周期变长了,直到程序结束才结束。static修饰全局变量,改变全局变量的链接属性,由外部链接属性变成内部链接属性。感觉像作用域变小了,限制了使用范围。自动 局部的变量是进入作用域创建,出了作用域销毁,自动创建,自动销毁,是auto类型 auto int n=1;#define M 100//M是没有地址的,M是一个量表示的符号。原创 2023-04-11 23:01:23 · 98 阅读 · 4 评论 -
初学C语言(2)
strlen是库函数,用来求字符串长度(字符个数),就是从给定的地址,向后数字符串,直到遇到\0,结束,\0不在统计内。局部变量:{{int a=100}printf(”%d”,a)}//代码出错,a变量的作用域只在自己的大括号,为局部变量。Printf("%C",'\'') 让单引号是一个单纯的单引号,可以被打印,如果不加\,默认第一二个是一对。Char ch[6]={'1','2','3','4','5','6'}//后面无\0。原创 2023-04-07 12:08:46 · 86 阅读 · 2 评论 -
初识 C语言(1)
微软的编译器认为scanf函数不安全,建议使用scanf_s,但是scanf_s是vs服务器提供的,不跨平台。C语言主要编译器:Clang、GCC、WIN-TC(现在用得较少)、SUBLIME(编辑器,可用于配置编译器)、MSVC(vs2019、vs2022)、Turbo C等。printf是一个库函数-C语言编译器提供的一个现成的函数,可以直接使用。代码一般是从 main函数开始写 大括号为函数体 C语言中main函数是程序的入口,程序是从main函数的第一行开始执行的 ,main函数有且只有一个。原创 2023-04-03 13:53:32 · 104 阅读 · 3 评论