c语言
文章平均质量分 77
分享c语言学习知识
kqs__
这个作者很懒,什么都没留下…
展开
-
C/C++内存管理
new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数class Apublic:: _a(a)~A()private:int _a;delete p2;// 内置类型是几乎是一样的// Cfree(p3);delete p4;free(p5);return 0;在vs2013版本编译器下:new多个对象时,系统会自动在对象前面加上。原创 2023-11-14 22:21:37 · 589 阅读 · 0 评论 -
Linux 函数库
最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?通过静态链接所生成的可执行文件的属性和动态库还是不同的。原创 2023-11-14 22:21:11 · 221 阅读 · 0 评论 -
预处理详解(二)
许多C 的编译器提供了一种能力,允许在命令行中定义符号。用于启动编译过程。例如:当我们根据同一个源文件要编译出一个程序的不同版本的时候,这个特性有点用处。(假定某个程序中声明了一个某个长度的数组,如果机器内存有限,我们需要一个很小的数组,但是另外一个机器内存大些,我们需要一个数组能够大些。for(i = 0;//linux 环境演示。原创 2023-11-03 22:27:06 · 133 阅读 · 0 评论 -
预处理详解(一)
define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(define macro)。下面是宏的声明方式:其中的 parament-list 是一个由逗号隔开的符号表,它们可能出现在stuff中。参数列表的左括号必须与name紧邻。如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。这个宏接收一个参数 x .如果在上述声明之后,你把5 * 5警告:这个宏存在一个问题:int a = 5;原创 2023-11-01 19:27:11 · 95 阅读 · 0 评论 -
linux下的程序环境和预处理(gcc演示)
在ANSI C的任何一种实现中,存在两个不同的环境。 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境,它用于实际执行代码。 组成一个程序的每个源文件通过编译过程分别转换成目标代码(object code)。 每个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。 链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接原创 2023-11-01 19:26:40 · 289 阅读 · 0 评论 -
初识函数(一)
简单来说 c语言把常用的函数进行封装,封装成一个个函数,供大家使用如(scanf,printf,strlen,strcmp,rand,srand,time),但c语言并不会直接实现库函数,而是提供了c语言的标准和库函数的约定,库函数的实现一般是由编译器来实现的 如 vs2022 gcc。我们在开发的过程中每个程序员都可能用的到,为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。2. 在编程的过程中我们会频繁的做一些字符串的拷贝工作(strcpy)。原创 2023-04-22 20:33:55 · 42 阅读 · 1 评论 -
数组还在困惑你?这不进来看看!!!
1. sizeof(数组名),数组名单独放在sizeof()内部,这里的数组名表示整个数组,计算的是整个数组的大小。所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。仔细观察输出的结果,我们知道,随着数组下标的增长,元素的地址,也在有规律的递增。数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。2. &数组名,这里的数组名也表示整个数组,这里取出的是整个数组的地址。原创 2023-05-06 21:00:40 · 77 阅读 · 6 评论 -
操作符及关键字
static 修饰全局变量,全局变量具有外部链接属性,所以在其他源文件内部依然可以使用(方法要正确),static修饰全局变量,改变了这个全局变量的链接属性,由外边链接属性变成了内部链接属性,这个静态变量只能在自己所在的源文件内部使用,不能在其他源文件内部使用了,感觉像是作用域变小了。static 修饰函数,static 修饰函数和static修饰全局变量是一样的,函数是具有外部链接属性的,但是被static修饰,就变成了内部链接属性,使得这个函数只能在自己所在的源文件内部使用,不能在其他文件内部使用的。原创 2023-04-12 17:29:15 · 85 阅读 · 1 评论 -
详解函数栈帧的创建和销毁
以上是本次要讲解的知识点,相信看完博客的你一定会有所收获。原创 2023-05-01 22:14:20 · 201 阅读 · 20 评论 -
快来看看通俗易懂的三子棋!哥不允许你不会!!!
我们的棋盘是建立在二维数组上的,数组下边是从 0 开始的。对于普通玩家来说并不知道,数组下标是从 0 开始的 ,这回使他输入的,和在棋盘上显示的有所差别,考虑到这里我们 让 row col 各减一就好了。6.棋盘初始化成功后我们就要进行打印棋盘,打印棋盘时函数有三行,我们可以每行每行的打印,为使棋盘美化一点我们打印的时候要 “ %c ” 在%c 两边加上空格 打印完 %c 后面紧接着便是 ‘|’了,但是我们这个竖杠 仅仅打印两个就好了 这个时候就在加入一个 if语句判断一下就好了,具体看代码操作。原创 2023-05-07 20:59:36 · 102 阅读 · 7 评论 -
分支和循环(二)及其 初识二分查找
以上代码算出来是15 ,显然是不对的,每次运算ret的值残留下来啦,没有被初始化导致除了第一次第二次ret的值是1,其余时候ret的值都不是1,所以我们要将每次进入内循环的ret初始化为1。for循环中也可以出现break和continue,他们的意义和在while循环中是一样的,但是还是有些差异。3.for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题。答:是零次 ,因为在判断部分,k被赋值为零,零为假所以 就不进入循环了。表达式3为调整部分,用于循环条件的调整。原创 2023-04-19 16:21:40 · 44 阅读 · 0 评论 -
初始c语言
第一个字符串没有 \0 所以打印出来不是我们想要的 但第二个同样也没有\0 为什么打印出来是我们想要的,因为第二组字符串后边其隐藏了一个\0 如第二张图所展示的那样。特别要注意最后两个 ’\ddd‘ '\xdd' 前一个是 d d d表示1~3个八进制的数字。如下 int arr[10] = {1,2,3,4,5,6,7,8,9,10};注意区别前置++ 和后置++的区别 前置++是先++ 后使用 ,后置++是先使用 ,后++转义字符就是改变了原来的意思的字符 一下是一些基本的转义字符。原创 2023-04-08 20:42:34 · 143 阅读 · 2 评论 -
开始学习c语言喽!!!
希望每天都可以坚持学习c语言。从一个小白到一个大佬!!!干就完事了!!原创 2023-04-01 20:39:13 · 268 阅读 · 11 评论 -
分支语句和循环语句(一)
如果不加‘break’ 还是会打印weekend,因为此时代码没有跳出循环,在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。此处什么都没有打印,我们预计的结果是打印 ‘haha’ ,但是却没有打印,因为else是和它最近的if匹配,这样当 a!当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。如果表达的值与所有的case标签的值都不匹配怎么办,其实也没什么,结构就是所有的语句都被跳过而已。原创 2023-04-16 16:36:04 · 62 阅读 · 7 评论 -
初识指针(一)
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。详解 pa 中存放着a的地址,* 是在说明pa是指针变量, int说明 pa指向的是int 类型的变量。通俗来讲 pa是某人住址的门牌号,而*p 是通过这个人的门牌号而找到这个人。指针其实是用来访问内存的。指针变量的大小取决于地址的大小。原创 2023-04-13 17:03:00 · 36 阅读 · 0 评论 -
扫雷(初阶)
我们这时候就要设计一个11*11的棋盘,但是只对其中的9*9进行排雷操作,对11*11的棋盘进行初始化。为了方便,我们将存放雷的棋盘和显示个=给玩家看的棋盘都设计成11*11的。棋盘的基本信息为9*9的棋盘,通常的扫雷游戏点击某一个位置时,会显示它周边八个位置雷的个数。第一张棋盘要存放储存的雷的信息(这张棋盘不能让玩游戏的人看见)但是如果是边角的话该位置并没有紧邻的八个位置,这该怎么办呢?第二张是让玩游戏的人看见的棋盘。用c语言来实现扫雷,我们需要两张棋盘。扫雷游戏的设计我们大体上分为四步走,原创 2023-05-09 21:47:29 · 40 阅读 · 0 评论 -
分支和循环(三)和 猜数字小游戏
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。goto 语句只能一个函数内部跳转,不能跨函数跳转的。例如:一次跳出两层或多层循环。原创 2023-04-20 19:13:55 · 54 阅读 · 0 评论 -
初试函数(二)静态库与递归
1 . 函数声明:1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。3. 函数的声明一般要放在头文件中的。2. 函数定义:函数的定义是指函数的具体实现,交待函数的功能实现。//函数的使用必须满足先声明后使用//函数声明 函数声明时形参的名字都可以不写////{// //输入// //加法//函数调用// //打印////}//原创 2023-04-30 16:25:54 · 47 阅读 · 1 评论 -
memcpy 和 memmove的模拟实现
memcpy指的是C和C++使用的内存拷贝函数,函数原型为void *memcpy(void*dest,void*src, size_t count);函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源src中拷贝n个。原创 2023-06-20 16:32:06 · 306 阅读 · 4 评论 -
实用调试技巧
第一次被发现的导致计算机错误的飞蛾,也是第一个计算机程序错误。3.1 调试环境的准备在环境中选择 debug 选项,才能使代码正常调试。3.2 学会快捷键最常使用的几个快捷键:F5启动调试,经常用来直接跳到下一个断点处。F9创建断点和取消断点断点的重要作用,可以在程序的任意位置设置断点。这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。F10逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。F11。原创 2023-05-20 19:51:20 · 47 阅读 · 0 评论 -
自定义类型:结构体,枚举,联合
1.结构体的声明2.位段3. 枚举4. 联合(共用体)原创 2023-06-22 10:50:43 · 256 阅读 · 3 评论 -
c语言的一些小题目(初阶),持续分享......
1.打印杨辉三角形2.打印X形图案3.打印菱形。原创 2023-06-05 22:23:35 · 404 阅读 · 0 评论 -
动态内存管理(malloc,calloc,realloc)
1.为什么存在动态内存分配2.动态内存函数的介绍3.常见的动态内存错误4.几个经典的笔试题5. C/C++程序的内存开辟。原创 2023-06-24 22:30:44 · 417 阅读 · 2 评论 -
模拟实现strstr函数,通俗易懂!!!
官方案例:网址。原创 2023-06-10 16:46:20 · 840 阅读 · 2 评论 -
sizeof 和 strlen !!!
sizeof()是单目操作符,是可以求变量(类型)所占空间的大小,不在乎内存中存放的是什么,只在乎内存大小strlen()是函数,是计算字符串的长度的 它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个结束符'\0'为止,然后返回计数器值(长度不包含'\0')其括号内部是字符指针,无论放在这个括号里的任何东西都会被当成一个地址注:数组名是什么呢?原创 2023-06-13 21:18:54 · 244 阅读 · 4 评论 -
指针(二)与操作符
当我们知道数组首元素的地址的时候,因为数组又是连续存放起来的,所以通过指针就可以遍历访问数组,数组是可以通过指针来访问的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的。指针变量就是指针变量,不是数组,指针变量的大小是4/8个字节。数组就是数组,不是指针,数组是一块连续的空间,可以存放一个或者多个类型相同的数据。有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。结构的成员可以是标量、数组、指针,甚至是其他结构体。结构体传参的时候,要传结构体的地址。原创 2023-05-18 18:47:40 · 60 阅读 · 0 评论 -
操作符详解(二)
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长。C的整型算术运算总是至少以缺省整型类型的精度来进行的。原创 2023-05-14 20:04:05 · 102 阅读 · 0 评论 -
模拟实现qsort函数(采用冒泡的方式),超详细!!!
函数声明头文件stdlib.h。原创 2023-06-11 22:27:34 · 186 阅读 · 4 评论 -
指针(一)
在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节。那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地。要将&num(num的地址)保存到p中,我们知道p就是一个指针变量,那它的类型是怎样的呢?概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)2.平时口语说的指针,通常指的是指针变量,是用来存放内存地址的变量。我们都知道,变量有不同的类型,整形,浮点型等。原创 2023-05-17 16:29:42 · 45 阅读 · 0 评论 -
实用调试技巧(二)
1. const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改。2. const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指。看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。4. 参数部分 const 的使用,这里讲解const修饰指针的作用。1. 分析参数的设计(命名,类型),返回值类型的设计。3. assert的使用,这里介绍assert的作用。2. 这里讲解野指针,空指针的危害。针指向的内容,可以通过指针改变。原创 2023-05-23 21:30:34 · 46 阅读 · 0 评论 -
指针(四)
1. 数组参数、指针参数2. 函数指针3. 函数指针数组4. 指向函数指针数组的指针5. 回调函数。原创 2023-06-15 22:22:04 · 325 阅读 · 2 评论 -
操作符详解
2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。这些关系运算符比较简单,没什么可讲的,但是我们要注意一些运算符使用时候的陷阱。1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。对于移位运算符,不要移动负数位,这个是标准未定义的。在编程的过程中== 和=不小心写错,导致的错误。注:移位操作符的操作数只能是整数。注:他们的操作数必须是整数。原创 2023-05-11 22:30:17 · 53 阅读 · 0 评论 -
指针(三)
1. 字符指针2. 数组指针3. 指针数组。原创 2023-06-06 22:00:26 · 775 阅读 · 5 评论 -
C语言文件操作
磁盘上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。2.1 程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。2.2 数据文件文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。我们这里讨论的是数据文件。原创 2023-07-03 16:13:47 · 107 阅读 · 2 评论 -
浮点型在内存中的存储
但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;0.5(1/2)的二进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则1.0*2^(-1),其阶码为-1+127=126,表示为01111110,而尾数1.0去掉整数部分为0,补齐0到23位00000000000000000000000,则其二进制表示形式为:0 01111110 00000000000000000000000。原创 2023-06-01 19:25:05 · 642 阅读 · 10 评论 -
通讯录!增删查改+排序!!!!全功能!!!
但动态版本要增加一个查询当前开辟的内存是否够用的函数,也就是上面的增容。2.声明完结构体我们便要创建一个结构体,对于静态版本而言,我们创建一个结构体数组,里面可以存放一千个人的信息,动态的而言我们创建一个结构体指针,以及其他两个内容来记录存储了多少个人的信息以及是否需要扩容。1.对于一个人的信息我们创建一个结构体来完成,对于每个成员的大小我们采用define 定义标识符常量,这样方便我们我们后期的维护和修改,而我们在选择功能的时候采用枚举,这样看起来直观增强了代码的阅读性。原创 2023-06-24 21:20:14 · 150 阅读 · 7 评论 -
深度剖析数据在内存中的存储
例如:一个 16bit 的 short 型 x ,在内存中的地址为 0x0010 , x 的值为 0x1122 ,那么 0x11 为。小端模式,刚好相反。型,32 bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32。大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址。小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地。字符在存储的时候存储的是ascii码值,是整形,所以归类的时候放在整形家族。原创 2023-05-27 22:36:17 · 59 阅读 · 0 评论 -
模拟实现atoi
atoi 模拟实现原创 2023-07-02 21:40:00 · 149 阅读 · 2 评论