
c语言
文章平均质量分 53
c语言入门
努力的小帅
这个作者很懒,什么都没留下…
展开
-
指针初学第一节
指针变量不再使⽤时,及时置NULL,指针使⽤之前检查有效性当指针变量指向⼀块区域的时候,我们可以通过指针访问该区域,后期不再使⽤这个指针访问空间的 时候,我们可以把该指针置为NULL。指针初始化 如果明确知道指针指向哪⾥就直接赋值地址,如果不知道指针应该指向哪⾥,可以给指针赋值NULL. NULL 是C语⾔中定义的⼀个标识符常量,值是0,0也是地址,这个地址是⽆法使⽤的,读写该地址 会报错。答案是:指针变量中。• 注意指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台下,⼤⼩都是相同的。原创 2024-09-27 21:43:39 · 360 阅读 · 0 评论 -
深入理解指针2
数组名是数组⾸元素的地址;那么在数组传参 的时候,传递的是数组名,也就是说本质上数组传参传递的是数组⾸元素的地址 (用指针变量来接受也i可以如int *arr 或者int arr[])指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪⾥?除此之外其他都是首元素的地址 数组的地址&数组名 &数组名+1指跳过整个数组。总结:⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。1:sizeof(数组名)这里数组名表示的是整个数组的大小。2:&数组名:也是表示的是整个数组的地址。原创 2024-10-08 22:51:14 · 150 阅读 · 0 评论 -
深入理解指针3
但是⽤相同的常量字符串去初始 化不同的数组的时候就会开辟出不同的内存块。char* p = 'abcdef' 这里的赋值是将字符串首元素的地址赋值给p(常量字符串地址不能被改变)且pf == Add,即Add(3,4)=pf(3, 4)==(*pf)(4,5)其实就是 数组指针--指向数组的指针--数组指针变量中存放数组的地址。⼆维数组传参本质上也是传递了地址,传递的是第⼀ ⾏这个⼀维数组的地址。1 是数组 是存放指针指针的数组 char* arr[5]即存放函数的地址(函数也有地址)原创 2024-10-13 12:03:18 · 265 阅读 · 0 评论 -
深入理解指针4
回调函数就是⼀个通过函数指针调⽤的函数。如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条 件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应。两个名字比较大小(字符串)用strcmp来比较(比较的不是长度 而是对应位置上字符的大小)4 comper 函数的地址(这个函数是用来比较两个元素)-> 结构体指针->成员名(不用再用解引用). 结构体变量.成员名。原创 2024-10-25 20:25:57 · 293 阅读 · 0 评论 -
深入理解指针4
strlen统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数。strlen 函数会⼀直向后找 \0 字符,直到找到为⽌,所以可能存在越界查找。在学习操作符的时候,我们学习了 sizeof , sizeof 计算变量所占内存内存空间⼤⼩的,单位是 字节,如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的⼤⼩。且sizeof是操作符而不是函数 strlen是函数,求字符串的长度。sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据。原创 2024-10-27 16:54:22 · 186 阅读 · 0 评论 -
字符函数和字符串函数
注意 0--数字0 '0'--ASCII是48 ‘\0’----\ddd ddd表示1~3个8进制数 \0----ASCII值为0。C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。为什莫strcpy函数的返回值为char* 为了实现链式访问 返回的是目标空间的起始地址修改后为。若arr2 放arr1从拷贝的字符串时 若给的个数大于arr1中的字符个数时不够的补\0。strerror---将错误码对应的错误信息的字符串的起始地址返回(获得字符串)原创 2024-11-02 21:05:42 · 354 阅读 · 0 评论 -
c语言内存函数
但用vs库里面memcpy能实现这种重叠(相当于vs里面memcpy的功能实现的跟memove一样)这是一种特里。例如把arr1的内容拷贝到arr1中(可能会出现重叠)memcpy(arr1+2,arr1,20);注意对于重叠的内存,交给memmove来处理(memcpy函数不负责重叠内存的拷贝)1. memcpy使⽤和模拟实现--内存拷贝 任何类型都可以拷贝。2. memmove使⽤和模拟实现--内存移动。3. memset函数的使⽤--内存设置。mem-memory--记忆--内存。原创 2024-11-02 22:50:23 · 201 阅读 · 0 评论 -
数据在内存中的存储
存储规律 同理short也可以推 signed int 和unsigned int 无太大用重要的是如何看待(就是打印时用的是%d %u)c语言中 char的符号不确定 大部分为signed char %d 打印有符号数 %u打印无符号数 而且打印时会发生整型提升。例子 10进制5.5 2进制 5.5==101.1 要看每一位的权重 S = 0 M = 1.011 E=2;关键为*(char*)&a的值 (char)a是不对的 因为拿的字节不一定为最低位的。1. 整数在内存中的存储。原创 2024-11-04 22:33:24 · 316 阅读 · 0 评论 -
自定义类型:结构体
4.如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构 体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。4. 当⼀个结构包含两个位段,第⼆个位段成员⽐较⼤,⽆法容纳于第⼀个位段剩余的位时,是舍弃 剩余的位还是利⽤,这是不确定的。总结(优点): 跟结构相⽐,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在。3.结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的 整数倍。原创 2024-11-06 23:14:54 · 767 阅读 · 0 评论 -
自定义类型——枚举和联合
联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的⼤⼩,⾄少是最⼤成员的⼤⼩(因为联合 ⾄少得有能⼒保存最⼤的那个成员)。当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。联合的⼤⼩⾄少是最⼤成员的⼤⼩。(不一定位最大成员的大小)*空间是重复的即不能同时使用两个成员,联合体在一定程度上可以节省空间。写代码多了就会感悟到枚举的作用。结构体的关键字:struct。联合体的关键字:union。枚举的关键字:enum。枚举关键字 enum。原创 2024-11-08 21:55:22 · 179 阅读 · 0 评论 -
动态内存管理
包含柔性数组成员的结构⽤malloc ()函数进⾏内存的动态分配,并且分配的内存应该⼤于结构的⼤。所以如果我们对申请的内存空间的内容要求初始化,那么可以很⽅便的使⽤calloc函数来完成任务。C99 中,结构中的最后⼀个元素允许是未知⼤⼩的数组,这就叫做『柔性数组』成员。返回栈空间地址的问题(即用malloc开辟空间返回就可以)sizeof 返回的这种结构⼤⼩不包括柔性数组的内存。**malloc申请的空间和数组的空间有什么区别呢?情况2 :2会将旧的数据拷贝到新的空间。1,动态内存的大小是可以调整的。原创 2024-11-11 11:45:07 · 253 阅读 · 0 评论 -
文件操作
ANSIC标准采⽤“缓冲⽂件系统”处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为 程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。缓 冲区的⼤⼩根据C编译系统决定的。每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名 字,⽂件状态及⽂件当前的位置等)。我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出 操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流 想象成流淌着字符的河。原创 2024-11-15 22:18:58 · 1591 阅读 · 0 评论 -
预处理详解
2. 更为重要的是函数的参数必须声明为特定的类型。宏的参数是类型⽆关 的。提⽰: 所以⽤于对数值表达式进⾏求值的宏定义都应该⽤这种⽅式加上括号,避免在使⽤宏时由于参数中的 操作符或邻近操作符之间不可预料的相互作⽤。的时候,如果参数带有副作⽤,那么你在使⽤这个宏的时候就可 能出现危险,导致不可预测的后果。#define机制包括了⼀个规定,允许把参数替换到⽂本中,这种实现通常称为宏(macro)或定义宏 (define macro)。1. 每次使⽤宏的时候,⼀份宏定义的代码将插⼊到程序中。原创 2024-11-17 22:17:02 · 407 阅读 · 0 评论 -
扫雷游戏的实践
如果棋盘的大小为9*9,数组的大小就为11*11(大一圈 防止了越界)(创建时使用字符数组就可以 因为这样不用写两套数组)排查雷1:输入一个坐标 2:判断是否越界3:判断是否是雷, 若是雷就炸死,不是雷就显示周围雷的个数。雷的信息用二维数组来存放 用两个数组 一个放雷 一个放排查出的信息 都用字符数组。排查雷 这个位置是雷就炸死,游戏结束,不是的话就告诉这个地方周围有几个雷。’1‘-’0‘=1 就为 49-48。test.c-----扫雷游戏的测试。把所有位置都找到 游戏结束。原创 2024-11-23 14:55:56 · 218 阅读 · 0 评论 -
操作符详解
:两数的某二进制位都为1 那么就为1, 其中只要有一个不为1, 整体就为0 6&-7==0。移位操作符(移动的时二进制位)(移动的是补码)(浮点数不能移位)(移动的位数是正数)右移分为逻辑右移和算数右移(具体哪一种取决于编译器,但通常位算术右移)~:(前三个都是双目预算符, 这个是单目)就是把二进制位全部取反。|:同理只要其中有一个位1,那么就为1,两个数全为0, 才为0。算数右移左边用原符号位填充, 右边丢弃。^:对应的二进制位相同为0,相异为1。逻辑右移就是左边补0,右边丢弃。原创 2024-11-26 11:38:35 · 199 阅读 · 0 评论