c语言
文章平均质量分 77
c语言的学习过程
7owq
这个作者很懒,什么都没留下…
展开
-
c语言指针(一)
我们举一个关于生活中的例子,来让我们更好的理解内存和地址,假设你在学校的一间宿舍里,你的朋友想要来找你玩,这时你的朋友就需要到一间一间的宿舍里面去找你,这样效率就会比较慢,但是你的朋友知道了你的寝室号,这样你的朋友就能够很快的找到你。我们加上了const就是为了防止a被修改的,如果p拿到了a的地址就能修改a了,这样就打破了const的限制,这样是不合理的,那怎么样才能防止p拿到了a的地址也不能修改了呢?在计算机中也是这样的,计算机中的数据都是存储在内存里面的,计算机需要读取数据也是从内存中读取的。原创 2024-04-21 22:26:35 · 814 阅读 · 1 评论 -
c语言指针(二)
但是,当我们学习了指针之后,知道了可以通过地址来间接访问到该变量的值,那我们就可以通过传递地址的方式,在函数中通过地址来访问到实参,并进行交换。我们也说过,数组名就是首元素的地址。sizeof(数组名),sizeof中单独放数组名的话,,这里的数组名指的是整个数组,计算的是整个数组的大小。&数组名,这里的数组名表示的是整个数组,取出的是整个数组的地址(整个数组的地址与数组首元素的地址是由区别的)我们可以这样理解,整型数组是存放整型的数组,字符数组是存放字符的数组,那么指针数组就是存放指针的数组了。原创 2024-04-22 22:45:18 · 711 阅读 · 0 评论 -
c语言动态内存管理
在c和c++中都会大量使用动态内存管理,使用c和c++实现数据结构的时候,也会使用动态内存管理我们在写代码的时候,一般会这样向内存申请空间但是我们发现,上面的这种写法有两个特点:1. 空间开辟的大小是固定的2. 数组在申明的时候,必须指定数组的长度,数组空间一旦确定了大小就不能调整但是对于空间的需求,不仅仅是上述的情况,有时候我们需要的空间大小在程序运行的时候才能知道,那数组在编译时开辟空间的方式就不能满足了。原创 2024-05-10 22:44:34 · 803 阅读 · 1 评论 -
C语言实现简易扫雷游戏
首先,游戏开始前,我们要先打印一个游戏选单,来确定玩游戏,或者退出游戏,这时我们就需要自定义一个函数来完成,用menu()来完成,我们通过选择1 或者 0,来确认,当然如果我们选择了别的数,就需要提醒他,选择错误,让他重新输入,这时就需要用到swtich语句了。我们想要同时初始化两个数组的时候,我们在传参的过程中,把想要初始化的值给写上,就可以完成两个数组的初始化,当然,我们也可以打印一下棋盘来看看是否初始化成功,这里就会用Dispaly()这个自定义函数来实现打印看看。我们用FindBoard来实现。原创 2024-03-18 20:58:27 · 303 阅读 · 1 评论 -
c语言函数指针数组
但是呢,我们发现这个代码会有一些问题,比如说,我们想要给这样的代码增加一些新的功能,那么这个case语句会越来越长,而且,还有一个问题是,这个case语句里面有好多重复的代码。当然,其实我们除了使用函数指针数组的方式来修改最先开始的代码,其实我们还有一种办法在创建一个calc函数,把case里面的计算逻辑封装在calc函数里面,但是又有问题了。我们知道,函数我们只需要知道地址就可以进行调用了,那我们就可以把进行函数的地址以参数的形式传递给calc函数就可以了。回调函数就是一个通过函数指针调用的函数。原创 2024-04-24 20:32:12 · 289 阅读 · 1 评论 -
c语言数组与指针题目理解
2.*--*++cpp+3,这么多运算符,怎么算的呢,首先肯定是先算++cpp,cpp在前面已经++了指向的是cp数组的第二个元素的地址,cpp再次++,指向的是cp数组第三个元素的地址,解引用得到(c+1),然后 --(c+1)得到的是cp的第四个元素的地址,解引用得到第四个元素,指向的是c数组的第一个元素的地址,地址+3,跳过三个字节,地址就从E跳到了E,所以后面的打印结果为ER。这里p指向的是a[0],带入表示之后相当于打印了a[0][0],就是整个二维数组,第一行第一个元素,就是1。原创 2024-04-28 18:17:08 · 623 阅读 · 0 评论 -
c语言函数递归与迭代
递归就是把一个大的问题层层转换为一个与原问题相识,但是规模较小的问题来求解,直到这个小问题不能再拆分,递归就结束了,所以递归的思考方式是把大事化小的过程;但是如果我们要求第50个的话,我们需要很长时间才能得到结果,为什么呢,因为在递归的过程中很多数字都是重复计算了的,递归层次越深,重复计算越多。这样我们就可以写出函数Fact来求n的阶乘,假设Fact(n)就是求n的阶乘,那么Fact(n-1)就是求n-1的阶乘;函数不返回,函数对应的栈帧空间就⼀直占⽤,所以如果函数调⽤中存在递归调⽤的话,每⼀次递归。原创 2024-04-01 10:06:24 · 410 阅读 · 0 评论 -
c语言内存操作函数
思路:我们知道它有一个参数num单位是字节,那我们就可以一个字符一个字节进行赋值,那我们就需要用到char*类型的指针,char*类型的指针+1跳过一个字符,利用循环,遍历完num个字节。虽然对于有重叠部分的memcpy()也能完成拷贝工作,但是memcpy()只是针对于没有重叠的完成拷贝工作就行了,对于重叠的部分,我们可以用memmove()函数来完成。在c语言中,有着各式各样的函数,今天我们来学习一下c语言中的内存操作函数。思路:这个函数和strncmp()函数一样,我们还是一个字节一个字节的比。原创 2024-05-02 13:55:43 · 673 阅读 · 1 评论 -
c语言中自定义类型
我们知道,传值调用,形参是实参的一份临时拷贝,那我们还需要再内存中开辟一块空间,如果这个结构体够大呢,那么就会开辟更大的空间,反之,传址调用,我们传一个地址过去,是地址大小不是4个字节(x86)就是8个字节(x64)。在c语言中,有内置类型,比如int,char,short,float,double...等等,这些都是c语言本身支持的现成的类型。4.如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有对齐数(含嵌套结构体中成员的对齐数)的整数倍。原创 2024-05-08 08:15:00 · 566 阅读 · 1 评论 -
c语言数据在内存中的存储
思路:我们知道大端字节序是把大的字节内容保存在前面,小端字节序是把小的字节内容保存在前面,那我们只需要取出它的第一个字节,我们拿1来做例子,如果拿出来的是01,那么它就是大端字节序,如果拿出来的是00。那么它就是小端字节序。浮点数的指数E等于 1 - 127(或者1 - 1023),即为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数,这样做是为了表示±0,以及接近于0的很小的数字。对于32位的浮点数,最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M。原创 2024-05-04 21:33:57 · 695 阅读 · 1 评论 -
c语言数组
从输出的结果我们可以看到,随着数组下标的增长,地址是由小到大变化的,而且每个相邻元素的大小都相差4(因为一个int是四个字节),所以得出,数组在内存中是连续存放的。arr_name指的是数组的名字,这个名字可以根据实际情况,起的有意义就行;这里就有一个下标引用操作符[],这个操作符是用来找到存在数组中的元素的;type是数组中存放数据的类型,可以是int,char,float等;【】中的常量值,是决定数组大小的,这个可以根据需求制定大小。数组在内存中是连续存放的。数组的下标是从0开始的。原创 2024-03-17 18:52:23 · 345 阅读 · 0 评论 -
冒泡排序与qsort函数
我们知道,qsort能接收任意类型的数据,是因为它的有几个参数是void*的,void*可以接收任意类型的指针,所以我们在冒泡排序中也可以改成用void*来接收。如果想要实现逆序,我们只需要把比较条件里面的p1和p2交换一下位置就可以了,这里就不演示了,感兴趣的可以自己下去试试。我们之前提到过,冒泡排序只能用来排序一种类型的数据,那我们能不能模仿qsort来实现一个冒泡排序的函数呢?根据这样,我们就完成了第一步,在然后,我们用冒泡排序的思想,两两相邻元素进行比较。看完了画图分析,我们就可以写代码了。原创 2024-04-25 23:39:58 · 162 阅读 · 1 评论 -
c语言字符函数与字符串函数
这里我们要知道strlen()函数返回的值是size_t,是无符号整数,那么两个无符号整数相减得到的也会是一个无符号的整数,虽然它是-3,但是它是无符号整数,肯定是会比0大的,所以结果是原创 2024-04-30 21:01:17 · 761 阅读 · 2 评论 -
c语言柔性数组
在c99中,结构体的最后一个元素允许是未知大小的数组,这个就是柔性数组。原创 2024-05-12 22:46:05 · 555 阅读 · 0 评论 -
c语言自定义类型(二)
在前面,我们提到了c语言中可以有自定义类型,我们学习了结构体struct,还有两个自定义类型enum枚举和union联合体没有了解,接下来我们对这两个自定义类型进行学习。原创 2024-05-10 09:45:00 · 1079 阅读 · 1 评论 -
c语言指针(三)
根据数组名是首元素地址的规则,二维数组的数组名表示的就是第一行的地址,那么第一行的一维数组的类型就是int[5];在之前我们的学习过程中,我们提到过怎么理解指针变量,举了一个int类型指针的例子,那我们可以通过这样的一个例子来写出字符指针。这里加上了一个p2在括号里面,先和*结合,说明p2是指针变量,指向的是整型数组,数组的每个元素都是整型。,所以p1先和[]结合,p1就是一个数组名,数组中的每个元素都是int*,所以p1是指针数组。数组指针变量:存放的应该是数组的地址,能够指向数组的指针变量。原创 2024-04-23 21:55:55 · 453 阅读 · 1 评论 -
C语言文件操作
文件是指,这些数据可以是文本,图片,程序,音频,视频等多种形式。在我们磁盘(硬盘,比如我们计算机里面的c盘,d盘)上面的文件就是文件。在程序设计中,我们一般谈的文件从文件功能的角度来分,一般有两种,程序文件和数据文件。原创 2024-05-15 23:35:16 · 696 阅读 · 0 评论 -
c语言简单实现猜数字游戏
rand函数的功能是生成一个伪随机数,这个函数的生成范围是0--RAND-MAX之间的,这RAND_MAX是依靠编译器实现的,大概是0-32767之间。这个rand函数是通过一个“ 种子 “的值来进行生成随机数的,一般默认这个种子为1,所以想要生成不同的随机数,就需要让这个种子随时发生变化。要完成这个游戏我们需要用到三个函数,一个是rand函数,一个是srand,还有一个是time函数。如果time函数的参数timer是NULL(空),就只返回这个时间的差值。这个函数就是用来初始化rand函数的种子的。原创 2024-03-14 23:23:23 · 257 阅读 · 0 评论 -
c语言操作符
算数操作符+,-是用来完成加法的,*是用来完成乘法,/是用来完成除法的,除号的两端如果是整数,执行的是整数除法,得到的结果也是整数,如果希望得到浮点数的结果,两个运算数必须至少有一个是浮点数。条件操作符的计算逻辑是,如果操作数1为真,则计算操作数2,计算的结果是整个表达式的结果,如果操作数1为假,则计算操作数3,计算的结果是整个表达式的结果。后面的就都是复合赋值操作符 +=, -=, *=, \=, %=, <<=, >>=, &=, |=, ^=,--是一种自减的操作符,也分为前置--和后置-原创 2024-04-12 22:34:10 · 711 阅读 · 0 评论 -
c语言中函数
c语言标准中规定了c语言的各种语法准则,c语言并不提供库函数,c语言的国际标准ANSIC规定了一些函数的标准,被称为标准库,那不同的编译器厂商根据ANSIC提供的语言标准给出了一系列函数的实现,这些函数就是库函数,比如scanf和printf等等,这些函数包含头文件都是可以直接使用的。在上面这个代码中,我们在Tmp这个自定义函数中,把x和y的值交换了,但是我们打印出来的a和b的值还是我们输入的3和5,所以我们得出,修改形式参数并不会影响实际参数。在上面的代码中,a和b都是实际参数,x和y则是形式参数;原创 2024-03-26 12:00:11 · 196 阅读 · 0 评论