自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 模仿memmove函数

复制字节很简单,但要考虑到当源内存块和目的内存块重叠,且目的指针在源指针前,此时从前向后复制,目的块元素会被覆盖,此时选择从后向前复制。

2024-05-09 21:19:11 359

原创 模仿strcpy函数和strlen函数,模仿库函数代码,代码风格简洁有效

模仿strcpy函数。模仿strlen函数。

2024-05-09 20:58:14 162

原创 模仿strstr函数,非常巧妙的方法,新手完全想不到

/如果是str2遇到0,说明str2已经在str1中比较完毕,返回cp即开始比较的第一个字符地址。//当只有前一部分字符串相同,但后续不同,跳出循环后,需要拿到cp++后的数,重新比较。/当只有前一部分字符串相同,但后续不同,跳出循环,需要拿回str2首字母指针。//当只有前一部分字符串相同,但后续不同,跳出循环,需要拿到cp++后的数。//非0都为真 字符ASCII码相减,相同为0,!//只有两个字符都不为0且相同才进入循环,++后比较下一位。//字符串出现0则跳出。

2024-05-09 20:30:03 335

原创 C语言面试,8道一定会遇到的----关于指针的笔试题详解

C语言面试,8道一定会遇到的----关于指针的笔试题详解

2024-05-03 22:50:14 240

原创 指针和数组笔试题解析(比较全面和基础)

4.在C语言中,使用sizeof计算二维数组的大小不会受到数组越界的影响,sizeof在编译时就确定了大小,并不实际访问内存位置。

2024-05-03 20:51:47 192

原创 面试题:从杨氏矩阵查找数字,要求:时间复杂度小于O(N);

如图,当与第三行最大值9相比,n3说明这一行没有要找的数,所以这一行可以排除,行加一。,循环直到最后一行,如果n大于最后一行最大数,说明找不到,跳出循环。有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的。,如果n小于最后一行最小值,说明找不到,跳出循环。杨氏矩阵只要求递增,不要求是等比或等差。

2024-05-03 16:44:51 171

原创 面试题:创建指针指向相同“常量字符串”,计算机只会在内存中存一份!

计算机只会在内存中申请一份空间存储,当不同的指针指向这个常量字符串,指向的都是首字母h的地址。,计算机只会在内存中存一份!如下代码,探究此问题。

2024-05-03 15:49:41 113

原创 面试题:数组指针的创建和访问,&取地址符号的使用//定义一个指向含有10个整型的数组的指针,如何通过这个指针访问数组?

上题答案选D,通过如下代码调试,D选项的用法虽然没有报错,但&arr是数组地址,而p是整型指针, 显然不合适,在面试题中D选项错误。

2024-05-03 15:35:42 179

原创 为什么不定义一个统一的指针呢?不同指针类型有什么意义呢?

定义一个变量,赋值为16进制a = 0x11223344,int类型占4个字节32位,16进制一个数占4位,两个数占8位,两个数是一个字节,低字节存储在低地址中,44存储在0x00D9F8FC地址中。针对不同的数据类型,指针有不同的类型,char*,int*,float*等等,既然指针都是4字节(32位)或8字节(64位)地址,那么为什么不定义一个统一的指针呢?3.另外,指针类型有助于编译器进行类型检查,如上方char*指针指向int*会警告类型不兼容。int*指针+1,地址加了4。

2024-04-27 09:36:10 354

原创 一道关于全局变量默认初始化为0+sizeof的返回值类型为无符号整形+(-1)转换为无符号整形是一个非常大的数字>4的一道杀人诛心的题!

C语言中,0为假,非0即为真。全局变量,没有给初始值时,编译其会默认将其初始化为0。i的初始值为0,i--结果-1,i为整形,sizeof(i)求i类型大小是4,按照此分析来看,结果应该选择B,但是sizeof的返回值类型实际为无符号整形,因此编译器会自动将左侧i自动转换为无符号整形的数据,-1对应的无符号整形是一个非常大的数字,超过4或者8,故实际应该选择A这道题其实很隐蔽,真是虾仁猪心!!!

2024-04-26 17:33:40 205 1

原创 十六进制数为什么是从低字节到高字节存储?别的进制也是这样存储的吗

对于十六进制数0x11223344,如果系统采用的是大端序,那么它在内存中的存储顺序将是11、22、33、44,从地址由低到高排列。总的来说,十六进制数本身并没有固定的存储顺序,它的存储方式取决于计算机系统的字节序。高字节

2024-04-26 17:22:20 478 1

原创 非常经典的汉诺塔,内含递归的精髓!文中包含个人理解

递归思想的精髓是只考虑怎么递归,把问题拆分为最小流程,尤其对于比较复杂的递归,不建议研究递归在计算机内具体是怎么运行的,否则很容易导致从入门到放弃。如果想要了解递归在计算机内具体如何执行的,可以按F111调试,右键转到反汇编,只要能看懂汇编语言就能理解。递归的精髓就是,把问题拆成最小流程,写出来,剩下的交给递归。

2024-04-26 09:23:00 455 1

原创 scanf函数为什么要输入两次才能进行下一步?

我丢,这样输入字符串后点击回车,再次输入内容再次回车,才能进行下一步,str只存储第一次输入的数据,同理,在scanf函数中双引号内加空格,那么在输入中也要加空格,scanf遇到空格也停止读取,加一些别的奇奇怪怪的东西也一样。scanf遇到空格停止读取,并把读取到的数据放入str,getchar()不读取空格,读取空格后遇到的第一个字符。

2024-04-25 22:03:48 310 1

原创 整型提升在计算机中的逻辑;发生溢出的逻辑

在C语言中,当一个算术表达式或逻辑表达式中存在不同类型的整型变量时,编译器会按照一定的规则将这些较小范围的类型自动转换成较大范围的类型,以确保计算的准确性和操作的一致性。如果表达式中的整型变量包括`char`、`signed char`、`unsigned char`、`short int`或`signed short int`等类型,它们会首先被提升到`int`类型。如果发现首位为1,则认为是负数的整型提升前面补1,对于负数存储的是补码,需要减一变为反码,再取反变为原码,原码转换为十进制数打印。

2024-04-25 16:33:35 435 1

原创 逻辑与&&和逻辑或||操作符的“短路”行为

在C语言中,逻辑与(&&)和逻辑或(||)操作符确实具有“短路”行为,也就是说,当操作符的结果已经能够确定时,它们会停止评估剩余的操作数。只执行了第一个操作数,a++先使用a后++ ,a = 0判断为false,此时操作符的结果已经能确定为假,发生逻辑与短路,不再进行后续操作。只执行了第一个操作数,a++先使用a后++ ,a = 1判断为true,此时操作符的结果已经能确定为真,发生逻辑或短路,不再进行后续操作。如果第一个操作数为true,那么整个表达式的结果必定是true,因此不会评估第二个操作数。

2024-04-25 15:52:49 402 1

原创 sizeof()操作符性质和注意事项

其中,1是指char数据类型占1个字节,下面两个4是在进行编译时,由于运算符的存在,发生了整型提升,char字符类型提升为int整型,变成了4个字节,而最后一个sizeof(!执行后结果为2 5,s占2个字节,s的值为5,sizeof括号中表达式未参与运算,这是因为sizeof在编译时已经执行,而运算在运行编译后的exe可执行程序时执行。在VS平台中执行结果为1 4 4 1,而在Linux平台使用gcc编译测试结果是1 4 4 4。

2024-04-25 15:36:49 142 1

原创 异或符号的理解--面试题:a = 3;b = 5;如何在不定义第三个变量的情况下交换ab的值?

把这个规律放到上面的问题中,a和b累次异或,两次异或等于b,三次异或等于a。这样就实现了a,b数值交换,并且不会产生溢出问题。但这样存在一个问题,如果a + b的值超过2^31-1,数据溢出发生截断,会丢失数据。面试题:a = 3;如何在不定义第三个变量的情况下交换ab的值?异或有一个规律,二进制数和自己按位异或等于0,二进制数和0按位异或等于它本身。

2024-04-25 14:48:50 278 1

原创 如何生成静态库,函数声明为什么放在头文件?

有个人做程序,遇到一个功能,不想自己做,就想去买一个功能回来,找到了另一个人,另一个人刚好有这个程序,但他卖程序只想卖功能的使用权,不想把源码都卖出去,于是他就生成静态库,只卖给他静态库。买程序的拿到静态库说了,你这静态库里边的东西我也看不懂(静态库为编译后的二进制文件),我怎么用这个功能呢?这时候卖程序的就把.h头文件也卖给他,在头文件里注释说明声明的函数功能,要传入的变量类型,返回值类型等,买文件的收到了头文件和静态库,只需要导入静态库和头文件,就可以调用需要的功能了。

2024-04-20 18:49:44 701

原创 使用函数前必声明、为什么函数声明放在头文件里?如何使用?

函数的声明一般放在.h头文件中,使用时要在主函数之前嵌入头文件,进行预编译,例如#include "add.h",等同于把add.h的内容放在此处,这样在多人开发程序时,能够很方便的合并项目和调用函数。使用函数前必声明,函数声明告诉编译器有一个函数叫什么,参数是什么,返回类型是什么,但是具体是不是存在,由函数定义负责。函数声明一般出现在函数使用之前,要满足先声明后使用,如果函数定义在主函数调用之前,未声明也可以使用。函数声明放在头文件是为了便于多人开发,同时出售功能代码时也将用到(详见下一篇博客)

2024-04-20 17:53:47 1847

原创 scanf和getchar的性质和使用,使用scanf和getchar时总取不到需要的数据?可能需要这个方法

当先使用scanf取数据再使用getchar时,如果中间输入空格(即使没有空格也有\n),由于缓冲区空格后的数据仍然存在,getchar会直接读取缓冲区的数据,会导致不能读取需要的数据,此时需要循环语句循环使用getchar把缓冲区中数据全部取走,到\n结束。getchar从缓冲区读取键盘输入,到\n停止,如果用在scanf后,会读取scanf留在缓冲区的\n,或者空格后的内容。scanf从缓冲区取数据,只取走\n前的数据,留下\n,并且遇到空格停止。下图探究了scanf和getchar的正确使用方法。

2024-04-17 20:53:02 264

原创 探究C语言指针的性质和使用方法

此时可以看到a在内存中的地址,整型a占4个字节,指针拿到的是第一个字节的内存地址,地址0x0050FDF0,值0a为16进制转换为10进制为10,后面三个地址末尾分别为F1,F2,F3,都被int a;定义了指针指向a,然后把a的地址赋值给pa,此时打印pa即为a的内存地址。我们知道指针指向的是内存中的地址,那么我们先看看变量在内存中的地址是什么样的(选择解决方案平台为x86/32位系统,内存地址占4个字节,在x64系统中,内存地址占8个字节)按F10进行逐过程调试,当调试走过定义int a;

2024-04-17 09:48:25 335

原创 C语言static的修饰作用

static修饰局部变量,改变了局部变量的生命周期,本质上是改变了变量的存储类型,原本局部变量存储在栈区,每次使用后都会释放,经过static修饰后,变量存储在静态区。 使用static修饰变量和函数时,不建议使用相同名字,使用同名变量和函数,不利于养成良好的编程习惯,容易导致混淆和逻辑错误,降低了代码的可维护性。

2024-04-16 21:13:55 161 1

原创 “Remote name must not be empty”远端名称不能为空,解决办法

在使用TortoiseGit时,commit提交成功后pull推送,弹出“Remote name must not be empty”远端名称不能为空。在Remote选项中,Remote填写origin,URL和Push URL粘贴仓库链接,点击Add New/Save添加新的远端。在项目文件夹中右键找到Tortoise Git>Settings。此时Remote已经可以选择刚添加的origin。点击OKPull成功。

2024-04-16 17:51:18 1191 2

原创 VS编译器中,字符串结尾默认存在\0,如果没有会乱码,VS2019中提示“可能没有为字符串arr2添加字符串0终止符”

【代码】字符串结尾默认存在\0,如果没有会乱码,VS2019中提示“可能没有为字符串arr2添加字符串0终止符”

2024-04-15 21:38:55 519 2

原创 常量的用法和注意事项

//1.字面常量是一个具体的数据值,包括整型、字符型和字符串型等#define MAX 99999//2.define定义的标识符常量,不能改extern int global_var;//3.定义在其他源文件中的全局变量,需要声明才能使用int main(){ const int num = 10;//4.const修饰的num是常变量(本质还是变量)但具有常属性,不能被改变 int n = 10;//变量n /*

2024-04-15 21:00:05 171 1

原创 提示scanf不安全,建议使用scanf_s

将 #define _CRT_SECURE_NO_WARNINGS 1 粘贴并保存到这个文件中,下次添加新建项,这行代码就会自动出现在新建项第一行了。(保存时需要管理员权限,请用管理员身份打开这个文件,或使用Notepad++。* 在VS2019中使用scanf函数时报错,提示scanf不安全,建议使用scanf_s,如果要使用scanf,需要在头文件也就是代码第一行中定义。* scanf_s函数是VS编译提供的,不是C语言标准规定的,为了程序的可移植性和养成良好的代码习惯,建议使用scanf。

2024-04-15 11:55:07 250 1

原创 在vs2019中使用扩展工具提交代码到gitee中,遇到的问题和解决方案

出现以下报错,是因为git不能上传vs2019创建的.vs中文件Git failed with a fatal error.Git失败并出现致命错误error: open("test01/.vs/test01/v16/Browse.VC.opendb"): Permission denied权限被拒绝fatal: Unable to process path test01/.vs/test01/v16/Browse.VC.opendb无法处理路径

2024-04-14 21:51:37 669 1

原创 安装vs2019community登录微软账户时显示:我们无法刷新此账户的凭据

安装vs2019community登录微软账户时显示:我们无法刷新此账户的凭据。我遇到的问题是由于太久没有登陆微软账户,以及没有在设备上验证你的身份,导致微软账户有些问题。点击账户,提示密码可能被盗,点击入门,顺便添加了第二个电子邮件用于账户验证。在Windows上验证身份过后再次登录就可以了。

2024-04-14 19:39:14 742 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除