c
文章平均质量分 57
我见青山多妩媚,料青山见我应如是!
好好学习,天天戒色
展开
-
通讯录系统分析(c语言完整代码)
C语言实现通讯录系统原创 2022-09-23 16:26:57 · 1909 阅读 · 0 评论 -
内存操作函数(c语言)
memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。如果源空间和目标空间出现重叠,就得使用memmove函数处理。原创 2022-09-13 20:34:59 · 273 阅读 · 0 评论 -
qsort(冒泡排序)
比较大小后换位置,因为不知道具体类型,我们把他们存在内存的数据进行交换,内存是以字节为单位的!int (cmp)(const void, const void*),比较2个元素大小的函数指针 );在这里的想&arr[j]与&arr[j+1]的比较这是不正确的,因为传地址所用的是void*类型。void是非常宽容的,可以接受任意类型的地址;void qsort (void* base, //待排序数据的起始地址。void指针也是不能够进行p++移动,因为不知道移动多大的内存。原创 2022-08-23 23:16:31 · 124 阅读 · 0 评论 -
内存中的存储(补码)
几道例题去理解计算机内存的原反补码。原创 2022-08-09 17:18:28 · 370 阅读 · 1 评论 -
Visual Studio的调试bug
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。原创 2022-08-03 13:32:42 · 706 阅读 · 0 评论 -
求二进制中 1 的个数的几个解法
非常巧妙的解法原创 2022-08-01 22:50:57 · 118 阅读 · 2 评论 -
扫雷游戏分析实现(完整代码)
扫雷游戏的分析与实现,附上c语言完整代码原创 2022-07-31 12:39:22 · 840 阅读 · 0 评论 -
编写一个函数reverse_string(char*string)
编写一个函数将字符串逆序(递归和非递归法)原创 2022-07-29 10:39:07 · 198 阅读 · 0 评论 -
三子棋分析与实现(C语言代码)
三子棋的分析,和代码实现,C语言的运用原创 2022-07-28 20:28:11 · 593 阅读 · 0 评论 -
c中结构体
1.结构体概念1.1.定义是一些值的集合;这些值被称为成员变量,结构中的每个成员变量可以具有不同类型。1.2.结构体(类型)名struct tag;//tag是类型名,struct tag这个整体相当于int,char类型1.3.结构体成员变量struct S { char a[20]; char b[5]; float c;//这里的a,b,c是成员变量};1.4.结构体变量名struct S s = { "abc", "man", 3.1415 };//s就是用S创建的变量。原创 2022-02-07 11:54:24 · 284 阅读 · 0 评论 -
C中指针再进阶
1.函数指针定义函数指针就是指向函数的指针,学习函数指针我们需要知道三点:1.( )的优先级要高于 * 。2.一个变量除去了变量名,便是它的变量类型。3.一个指针变量除去了变量名和 * ,便是指针指向的内容的类型。#include<stdio.h>int Add(int x, int y){ return x + y;}int main(){ int(*p)(int, int) = &Add;//取出函数的地址放在函数指针p中 return 0;}解释:原创 2022-01-23 21:43:29 · 200 阅读 · 0 评论 -
c中动态内存分配
1.内存结构栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。分配方式类似于链表。数据段(静态区)(static)存放全局变量、静态数据。程序结束后由系统释放。代码段:存放函数体(类成员函数原创 2022-01-23 22:32:15 · 236 阅读 · 0 评论 -
函数调用(实参和形参)
1.函数定义和调用(以a+b为例)注意:在定义时要保持类型相同(要求指定的函数类型和return语句的表达式类型一致)2.对于不带回值的函数,应当定义为void(空)类型,输出结果就在void函数中printf即可3.上述的调用函数,可以定义为多个模块,避免多个函数体均在一个文件中冗长。add.c存放调用函数,add.h存放函数定义,test.c存放main函数并引用“add.h”4.实参和形参的关系:临时拷贝所以传值的方式,得到的地址是不同的,因此形参只是对实参的临时拷贝,不能修改里原创 2022-01-13 14:44:35 · 3230 阅读 · 0 评论 -
c中指针进阶
1、const定义:将 const 变量称为常量,常量一旦被创建后其值就不能再改变,所以常量必须在定义的同时赋值(初始化),后面的任何赋值行为都将引发错误。const int MaxNum = 100; //班级的最大人数MaxNum = 90; //错误,试图向 const 变量写入数据区分 int const* 和 int* const(1)int const*所修饰的指针变量,其指针变量本身(即指向元素的地址)是可以被修改的,但是其指针所指向的值是不允许被修改的。(2)其实是con原创 2022-01-23 19:33:37 · 215 阅读 · 0 评论 -
c中初始指针
1.认识指针第一:指针是内存中一个最小单元(或者最大,取决于机器)的编号,指针即地址。第二:日常口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量。2.指针大小对于32位的机器,即有32根地址线,因为每根地址线能产生正电(1)或负电(0),所以在32位的机器上能够产生的地址信号就是32个0/1组成的二进制序列,一共 2的32次方个地址,用32个bit位进行存储,而8个bit位等价于1个字节,所以在32位的平台下指针的大小为4个字节。总结:指针大小固定,在32位平台下4个字节,在64位平台原创 2022-01-21 12:08:34 · 482 阅读 · 0 评论 -
深度解剖c语言(预处理)
程序翻译过程:预处理-E:头文件展开,先去注释后宏替换编译-S: 将干净的c语言编译成汇编语言汇编-C: 将汇编语言翻译成目标二进制文件链接:将目标二进制文件与相关库链接,形成可执行程序第一条先去注释后宏替换的证明1. define#define 的替换规则1.宏调用时,首先检查并替换参数和宏体中用#define定义的符号。2.然后再将宏和参数的值替换过去。扫描结果文本,若仍包含#define定义内容,就重复上述处理。2.define和typedef#define.原创 2022-02-24 14:21:38 · 93 阅读 · 0 评论 -
深度解剖c语言(函数栈帧)
1.内存结构数据在内存中存储是低地址到高地址的依次为代码区,字符常量区,已初始化的全局变量区,未初始化的,堆区,栈区栈区和堆区是相向增长的,其中栈区数据高->低2.认识相关寄存器3.函数栈帧main函数也是函数,也会创建函数栈帧高级语言->汇编语言->机器语言,从汇编的角度分析4.main函数栈帧分析ebp-8,证明栈帧是高向低地址存储eax说明数据临时拷贝到寄存器临时拷贝:1.临时拷贝的形成是在函数正式被调用之前就形成了的2.形参实例化原创 2022-02-24 13:51:57 · 441 阅读 · 0 评论 -
c中运算符
1.运算符的优先级:口诀括号方框特殊级,还有高级结构体自增自减后前缀,取反取非取地址乘除加减左右移,大小比较等不等按位与或看逻辑,三目条件最低级最有逗号来垫底,自左到右看最后2.算术移位和逻辑移位计算机组成原理的第二章:(左移一位就是乘2,右移一位就是除2)逻辑移位:不管数的正负,不管数左移还是右移,移走的位填数字0算术移位:正数:左移和右移都填0(要固定符号位)负数:原码:填0反码:填1移码:左0右13.按位取反:其实相当于是移码操作4.逗号操作符:自左到右看最后5..原创 2022-01-10 11:48:36 · 191 阅读 · 0 评论 -
指针(址)的传递
1.指针(指针变量)一个变量的地址称为该变量的指针,地址是指向该变量单元的。2.指针定义&是取地址运算符;是指针运算符,也叫间接访问运算符int p=&a的解释:将变量a的地址取出来&a,p指针是存放地址的,把&a赋值给p,int是保持与变量a同一类型的。3.指针的值传递和址传递我们知道实参传给形参的时候只是一份临时拷贝真正使用址传递才能修改实参的数值:定义常量temp,并和p(就是a,b的值)相联系起来除上述表达外,是否能用以下两种方式来传址呢?原创 2022-01-14 17:30:26 · 1528 阅读 · 0 评论 -
c中scanf用法
1.scanf要遵守格式2.注意%d%d 和%d %d(后者中间有空格)在输入数据两者没有区别在输入数字的时候中间需要加空格(至少一个,多个没有影响)3.使用double的不同格式4.%c的用法:注意空格和转移字符也占一位5.混入输入数字和字母此时的f输出就是空格,所以数值表现为0.0000006.字符输入getchar:输入缓冲区的问题输入:char a=getchar();输出:putchar(a);输入时只能按照字符串的方式输入(如果每个字符之间有空格和enter,就不原创 2022-01-09 13:11:21 · 1073 阅读 · 0 评论 -
c语言再识指针
1.字符指针和字符数组的关系字符指针:常见的有两种表达第一种表达:“a”是一个字符。#include<stdio.h>int main(){ char ch = 'a'; char* p = &ch; return 0;}第二种表达:"hello csdn."是一个常量字符串。#include<stdio.h>int main(){ char* p = "hello csdn."; printf("%c\n", *p);//打印字符'h'原创 2022-01-21 21:47:47 · 320 阅读 · 0 评论 -
C语言变量
1.全局变量和局部变量全局变量:定义在main函数之上,作用于整个函数局部变量:在main函数内或者在{ 例如循环 }内,调用后就释放2.静态存储和动态存储静态存储方式:程序运行期间由系统分配固定的存储空间的方式动态存储方式:根据需要进行动态的分配存储空间的方式内存中供用用户使用的存储空间可以分为三部分:程序区,静态存储区(全局变量),动态存储区(局部变量)3.C语言中的每一个变量有两个属性:数据类型和数据的存储类型4.auto型:实际上就是局部变量,因此auto省略不写static原创 2022-01-13 21:11:21 · 69 阅读 · 0 评论 -
字符串?=字符+\0
1.%c用来定义字符,%s用来定义字符串,\0是结束符标志2.用数组定义字符串的的时候需要考虑到[ ]内的大小(在内存中分配一片连续的空间)3.字符串==字符+\0,而单独的字符输出的是烫烫烫?其实是随机的数据4.根据上述关系,我们也能计算出两者的长度(字符串对应就是\0前面所有元素的个数)(字符对应就是随机数值了)5.字符串专用gets和puts,那么和scanf的区别?scanf遇到空格就停止输入,而gets是直到遇到Enterputs的用法?相当于printf打印结果后自动原创 2022-01-11 21:02:55 · 189 阅读 · 0 评论 -
深度解剖c语言(关键字)
1.sizeof的三种表达2.整形存储的本质1.先有空间,再有内容2.在将数据保存在空间内的时候,数据已经被转化成二进制3.整形存储的时候,空间是不关心内容的4.类型数据在读取的时候才有意义,决定了如何解释空间内部保存的二进制序列3.用!(非)表示bool(条件判断)4.浮点数比较问题浮点数在比较的时候,绝对不能直接比较?因为本身有精度损失,进而导致各种结果有细微的差别那怎么比较?int mian{ if(fabs(x-y)<DBL_EPSILON){原创 2022-02-23 10:31:32 · 443 阅读 · 0 评论 -
指针和数组的关系
1.区别a,*a,&a,&a[0]在一维中(1)a=p, 将a转化为p去看,a+1,就是指针动一步,指向下一元素(2)*a相当于计算问题 =>*(a+0)=>*(p+0)=>a[ 0 ]为值(3)&a代表整个数组。&a+1=>跨越整个数组(4)&a[0]=>首元素的地址在二维中(1)之前a是一维是第一个元素,这里升级a是一行,a+1=>到第二行(2)*a相当于=>*(a+0)=>a[0],代表原创 2022-01-22 22:08:13 · 586 阅读 · 0 评论 -
c中continue和break
先说for循环里面的内容:第1步.i=100 -> 第2步.i《100 -> 第3步.if语句 -> 第4步.pribtf ->第 5步.i++continue:(提前结束本次循环)当执行这个语句时,后面的代码就不用执行了,直接跳到第5步输出的结果就是:100,101,103,104,106…当循环到达102时进入if语句continue,然后不执行printf跳到i++break:(跳出循环不再执行)练习:如下的代码发生什么情况答:进入死循环,因为cont.原创 2022-01-10 17:32:59 · 51 阅读 · 0 评论