
C语言
文章平均质量分 63
信手斩龙
新手 求求多多关照
展开
-
【C语言】模拟实现memcpy、memmove、memset函数
memcpy原型void* (void* dest,const void* src,size_t len)为什么是void呢?,因为memcpy支持任何匀速类型的拷贝,所以给成void类型,然后在进行强制类型转化即可达到任意类型的拷贝。这同样也是strcpy和memcpy的一个差别,这里mempy是对内存进行操作的所以无论你是什么类型,都可以对其进行操作。memcpy模拟实现void *my_memcpy(void *det, const void *src, int num) { cha原创 2021-03-13 17:09:38 · 268 阅读 · 0 评论 -
【C语言】内存重叠详解
什么是“内存重叠”?当我们进行内存拷贝(memcpy函数)时,目标地址在原地址的范围内就造成了内存重叠。这么说可能会比较抽象,下面我们借助于memcpy函数通过一个例子说明。memcpy(void *dest, void *src, size_t num)是将src指向的地址中的num=5个字节拷贝到dest目标地址中。根据dest和src的关系,可以分为以下三类:case1:目标地址与源地址没有任何重叠(dest > src + 5或者dest < src - 5)时,可以直接从原创 2021-03-13 00:35:48 · 2834 阅读 · 2 评论 -
【C语言】strncpy详解
1.不考虑内存重叠的strncpy网上很多博客也写了这个函数,面试也常常会遇到,但是,我发现网上的很多代码都是有问题的,我们先看下大部分网上博客的实现:char *strncpy(char *dst, const char *src, size_t len){ assert(dst != NULL && src != NULL); char *res = dst; while (len--) { *dst++ = *src++; } return res;}看着好原创 2021-03-12 23:50:59 · 9773 阅读 · 1 评论 -
【C语言】strcpy函数的缺点
用法这是C语言里面复制字符串的库函数, 函数声明包括在专门处理字符串的头文件<string.h>中:char * strcpy( char * dst, const char * src );这个函数把字符串src复制到一分配好的字符串空间dst中,复制的时候包括标志字符串结尾的空字符一起复制。操作成功,返回dst,否则返回NULL.需要注意的问题函数里的局部变量一般都是按序排放的,并且因为是分配在堆栈之中,它们的地址是向下“增长”,即向低地址方向增长。比如下面的程序: int原创 2021-03-12 23:09:12 · 533 阅读 · 0 评论 -
【C语言】冷知识——前置++和后置++
今天在学习运算符的时候,发现了一个非常有意思的现象,关于前置++和后置++的不同之处。前置++是先给变量+1,然后进行使用后置++是先使用变量,然后进行+1.首先先给大家看一段代码,看看大家是否能正确得出结论int i=0;int j=0;printf(“%d %d %d”,i++,i++,i++);printf(“%d %d %d”,++j,++j,++j);大家觉得答案是什么呢?可以先自己进行运算,下面我们给出结论:2 , 1, 0 //后置++3 , 3, 3 /原创 2021-01-20 09:58:27 · 2316 阅读 · 0 评论 -
【C语言】变长结构体
什么叫变长结构体?其实真正意义上并不是结构体的大小可变,而是使用结构体中的变量代表一个地址,从而访问超出结构体大小范围的数据。struct Var_Len_Struct{ int nsize; char buffer[0];};那结构体是怎么实现可变长的呢?如上所示,请注意看结构体中的最后一个元素,一个没有元素的数组。我们可以通过动态开辟一个比结构体大的空间,然后让buffer去指向那些额外的空间,这样就可以实现可变长的结构体了。更为巧妙的是,我们甚至可以用nsize存储字符原创 2021-01-19 09:19:00 · 2011 阅读 · 0 评论 -
【C语言】sizeof和strlen区别
首先我们来看一下sizeof和strlen的区别:sizeof操作符的结果类型为size_t(它在头文件用typedfe定义为unsigned int类型),计算的是分配空间的实际字节数。strlen结果类型也为size_t(size_t strlen( const char *string )),但strlen是计算的空间中字符的个数(不包括‘\0’)。sizeof是运算符,可以以类型、函数、做参数 。strlen是函数,只能以char*(字符串)做参数。而且,要想得到的结果正确必须包含 ‘\0’原创 2021-01-15 11:43:36 · 208 阅读 · 0 评论 -
【C语言】程序编译过程详解
我们的代码会经过这4个环节,从而形成最终文件,c语言作为编译语言,用来向计算机发出指令。让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。预处理, 展开头文件/宏替换/去掉注释/条件编译 (test.i main .i)编译, 检查语法,生成汇编 ( test.s main .s)汇编, 汇编代码转换机器转载 2021-01-14 12:48:15 · 447 阅读 · 0 评论 -
【C语言】内存对齐和大小端问题
首先我们先举个例子,试着算一下结构体的大小class S1{ char _c1; int _i; char _c2;};class S2{ char c1; char c2; int i;};class S3{ double d; char c; int i;};class S4{ char c1; struct S3 s3; double d;};我们先来看一下结构体内存对齐的规则:第一个成员在与结构体偏移量为0的地址处。原创 2021-01-14 12:44:12 · 627 阅读 · 0 评论 -
【C语言】函数的调用约定
函数的调用约定调用约定(Calling convention)决定以下内容:函数参数的压栈顺序,由调用者还是被调用者把参数弹出栈,以及产生函数修饰名的方法。MFC支持以下调用约定:1、_cdecl按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于“C”函数或者变量,修饰名是在函数名前加下划线。对于“C++”函数,有所不同。如函数void test(void)的修饰名是_test;对于不属于一个类的“C++”全局函数,修饰名是?test@@ZAXXZ。这是MFC缺省调用约定。由于是调用者负责把参原创 2021-01-14 12:16:45 · 457 阅读 · 0 评论 -
【C语言】秒懂!const修饰的指针
对于const修饰的指针,很多小伙伴们不是很清楚其使用的方法,导致很多时候错误的使用,在这里我将浅显易懂的讲解const对于指针的用法!首先const修饰的指针类型有以下几种:1.const int *p2.int const *p3.int *const p4.const int *const p下来我们具体讨论其使用方法1.const int *p 这里我们只需要搞清楚const修饰的是什么,就可以得出结论我们将类型去掉,const … *p,我们可以看到,const其实主要原创 2021-01-14 10:23:30 · 523 阅读 · 1 评论 -
【C语言】 指针超详细解答
在我们初学C语言的时候,大多数同学在学到指针这一部分的时候就大呼头疼…确实在C语言中指针是难点也是重点,所以在这里我们给大家梳理一下指针的详细知识点和雷区,让大家不在惧怕指针。一、什么是指针? 要知道什么是指针,要先了解变量在内存中如何存储的。在存储时,内存被分为一块一块的。每一块都有一个特有的编号。而这个编号可以暂时理解为指针,就像酒店的门牌号一样。下面我们先看一串代码:#include <stdio.h>int main(){ int a = 10;//在内存中开辟一块空原创 2020-12-11 22:19:19 · 307 阅读 · 0 评论 -
【C语言】 整型提升和整型溢出
首先什么是整型溢出?对于整型溢出,分为无符号整型溢出和有符号整型溢出。对于unsigned整型溢出,C语言的定义是——“溢出后的数会以2^(8*sizeof(type))作模运算”,也就是说,如果一个unsigned char(1字符,8bits)溢出了,会把溢出的值与256求模。例如:unsigned char x = 0xff; printf("%d\n", ++x);上面的代码会输出:0 (因为0xff + 1是256,与2^8求模后就是0)对于signed整型的溢出,C的规范定义是“und原创 2020-12-11 22:18:53 · 473 阅读 · 0 评论 -
【C语言】扫雷高级版:可进行展开
这次是写一个扫雷的小游戏,可实现周围没雷时展开和第一次排雷不被炸死。下图是最终效果图:1.首先我们需要建立两个数组(mine和show),而且为了边上的坐标也能排雷,所以需要建的数组要比棋盘多两行两列。然后就是初始化数组(mine初始化为字符0,show初始化为 *)void InitBoard(char board[ROWS][COLS], int rows, int cols, cha...原创 2019-05-23 17:39:03 · 532 阅读 · 0 评论 -
【C语言】三子棋智能版(初学者必看)
c语言实现简单的游戏——三子棋代码思路:1.先创建一个二维数组;2.初始化数组,使这个数组里全为空格;3.打印棋盘;4.玩家下棋(判断坐标合法性);5.电脑下棋(随机落子);6.判断输赢;在源文件中添加一个test.c用来测试代码代码首先得打印一个菜单:void menu(){ printf("*******************\n"); printf("*** ...原创 2019-05-03 13:40:05 · 536 阅读 · 0 评论