当前位置: 首页 > news >正文

C/C++复习(一)

1.sizeof

关于sizeof我们是经常使用的,所以使用方法就不需要提及了,这里我们需要注意的是,sizeof 后面如果是表达式可以不用括号,并且sizeof实际上不参与运算,返回的是内容的类型大小(size_t类型)------sizeof是在编译时就确定结果的


2.scanf/fscanf/sscanf 与 printf/fprintf/sprintf

对于每一个学习C、C++的同学来说,区分上面的内容非常重要!!!

       

当然实际上还有snprintf这样可以读入读出n个字节的输入输出函数!!!

可以适当留意下输出的对齐符(+-)左右对齐


3.指针(重点)

        指针可以说是我们C、C++程序员最重要的知识了,所以我们必须要熟悉其全部内容

        首先,指针变量的大小与指针指向的类型无关,只与编译器环境有关(x86/x64)

区分指针数组/数组指针:

        指针数组:表示的是一个数组,但是数组的元素都是指针

        数组指针:表示一个指针,但是指向的是一个数组

联系知识:

        sizeof(arr)/&arr(arr是一个数组):表示的是对数组的整体操作,而非对数组的某个元素操作!!!

函数指针:
        规则:

        指向的函数返回类型  (*函数名)(指向的函数的参数类型与个数)

        例如:

int Add(int x,int y)
{return x+y;
}//需要注意的是:函数名可以表示函数地址int main()
{int (*pf) (int,int) =Add;//定义一个函数指针指向Add函数//进行相关的操作return 0;
}

     


4.库函数实现

 strlen实现:

//参数是const,注意统计的是'\0'之前的字符数量
size_t strlen(const char* str)
{size_t ans = 0;while (*str){ans++;str++;}return ans;
}

 现在我们增加难度,如果我要求不能使用计数器来实现strlen,请写出代码:

//参数是const,注意统计的是'\0'之前的字符数量
size_t strlen(const char* str)
{size_t ans = 0;while (*str){ans++;str++;}return ans;
}

 假如我是面试官,请联系指针特性再写一种方法实现strlen:

size_t strlen(const char* str)
{const char* p=str;while(*p){p++;}return p-str;//指针-指针
}

下面是三个不考的库函数实现:

//1.strcpy实现
char* strcpy(char* dest,const char* src)
{//检查:assert(dest!=null);assert(src!=null);//首先用一个新指针记录dest指针起始位置,便于后面dest后移可以找到头部char* p=dest;while((*dest++=*src++)){}return p;
}//2.strcat实现
char* strcat(char* dest,const char* src)
{//检查:assert(dest!=null);assert(src!=null);//同理记录dest起始位置char* p=dest;//先将dest走空while(*dest!='\0'){dest++;}//再拷贝while((*dest++=*src++)){}return p;
}//3.strcmp实现
int strcmp(const char* str1,const char* str2)
{//判断:assert(str1!=null);assert(str2!=null);while(*str1==*str2){//检查:是否已经出现str1为'\0'情况if(*str1=='\0')   return 0; str1++;str2++;}return *str1-*str2;
}

 对于上面上个库函数的衍生:strncat/strncmp/strncpy

我们是需要保证在n个字符的情况下实现即可!!!

大家可以去参考我之前写的博客:字符串函数详解_tolower 头文件-CSDN博客

下面是几个面试常考的库函数实现:

1.strstr实现:

char* strstr(const char* str1,const char* str2)
{//最简单实现:O(N^2)char* p=(char*) str1;//注意强转//检查str2if(!*str2)return p;while(*p){char* s1=p;char* s2=(char*) str2;while(*s1!='\0'&&*s2!='\0'&&(*s1==*s2)){s1++;s2++;}if(*s2=='\0')return p;p++;}return null;
}


5.内存函数

内存函数:memecpy/memset/memmove/memcmp,其中重点考察的是memmove和memcpy,我们这里只讲解重点内容的实现,其他部分可以参考下面链接:

C语⾔内存函数-CSDN博客

memcpy实现:

//注意点:我们的返回值和参数都是void*,因为我们也不确定要拷贝的类型,num为字节数
void* memcpy(void* dest,const void* src,size_t num)
{void* p=dest;//检查:assert(dest);assert(src);while(num--){*(char*)dest=*(char*)src;dest=(char*)dest+1;src=(char*)src+1;}return p;
}

memmove实现:

//注意:返回值和参数都是void*
void* memmove(void* dest,const void* src,size_t num)
{//检查:assert(dest!=null);assert(src!=null);void* p=dest;//方便返回//判断是否出现内存重叠if(dest<=src||(char*)dest>=(char*)src+num){//无内存重叠while(num--){*(char*)dest=*(char*)src;dest=(char*)dest+1;src=(char*)src+1;}}else{//有内存重叠    //此时我们可以从后向前拷贝dest=(char*)dest+num-1;src=(char*)src+num-1;while(num--){//拷贝*(char*)dest=*(char*)src;dest=(char*)dest-1;src=(char*)src-1;}}return p;
}

memcpy与memmove区别:

如果memmove函数处理的源内存块和目标内存块是可以重叠的,而memcpy是不处理重叠部分的,对于重叠的是未定义的


6.数据储存

整数的储存:

正整数原反补相同,负数各不相同

原码:将整数按照数值位转变成二进制即可,最高位负数为1,正数为0

反码:符号位(最高位)不变,其余为按位取反(负数)

补码:在反码的基础上+1

注意点:在计算机中整数全部按照补码存取

大小端:

        存在原因:对于数据超过一个字节,而内存中一个地址对应一个字节,所以必然产生如何存储顺序的问题。

大端:将数据的低位字节存储在内存地址的高字节中

小端:将数据的高字节存储在在内存地址的低字节中

那么我们如何判断大小端呢?

//通常有以下两种方法
//法一:指针转换法
void Test1()
{int i=1;//0x00000001int ret=*(char*)&i;//将四字节转换为一字节,判断低位是0x00还是0x01if(ret==1){//如果是1,说明数据的小端存储在内存的小端std::cout<<"小端”<<std::endl;}else{//否则说明数据的大端储存在内存的大端std::cout<<"大端"<<std::endl;}
}
//法二:联合体判断法
Union 
{int i;char ch;
}UU;
void Test2()
{UU.i=1;//通过判断ch的值就可以判断大小端,与上面道理相似if(UU.ch==1){std::cout<<"小端”<<std::endl;}else{std::cout<<"大端"<<std::endl;}
}

下面我们来补充一个知识:大小端转换

        这里我们就直接实现:

//现在假设我们要将0x12345678转换为0x78563412template<size_t T>
inline void convert(char* val)
{std::swap(*val,*(val+T-1));convert<T-2>(val+1);
}template<class T>
inline Apply(T* val)
{convert(sizeof(T)>((char*)val);
}int main()
{int i=0x12345678;Apply<int>(&i);std::cout<<i<<std::endl;return 0;
}

最后,感谢大家的支持,祝大家国庆节快乐!!!

相关文章:

C/C++复习(一)

1.sizeof 关于sizeof我们是经常使用的&#xff0c;所以使用方法就不需要提及了&#xff0c;这里我们需要注意的是&#xff0c;sizeof 后面如果是表达式可以不用括号&#xff0c;并且sizeof实际上不参与运算&#xff0c;返回的是内容的类型大小&#xff08;size_t类型&#xff0…...

iOS Object-C 将数组倒置(倒叙)

使用NSArray自带的对象方法:reverseObjectEnumerator 代码如下: NSArray * tempArray [[NSArray alloc]initWithObjects:"a","b","c","d", nil]; //将tempArray转换成["d","c","b","a"]; …...

动态轻量级线程池项目

动态线程池&#xff1a; 使用线程池ThreadPoolExecutor过程中你是否有以下痛点呢&#xff1f; ① 代码中创建了一个ThreadPoolExecutor&#xff0c;但是不知道参数设置多少比较合适。 ② 凭经验设置参数值&#xff0c;上线后发现需要调整&#xff0c;改代码重新发布服务&…...

【AI知识点】批归一化(Batch Normalization)

更多AI知识点总结见我的专栏&#xff1a;【AI知识点】 AI论文精读、项目和一些个人思考见我另一专栏&#xff1a;【AI修炼之路】 有什么问题、批评和建议都非常欢迎交流&#xff0c;三人行必有我师焉&#x1f601; 批归一化&#xff08;Batch Normalization&#xff0c;BN&…...

【低代码】前端低代码开发日记2:遇到的问题(1)双向绑定

在前期的快速迭代阶段&#xff0c;虽然界面有些杂乱&#xff0c;但整体功能尚能凑合运行。真正让人头疼的&#xff0c;还是接下来几个关键功能的实现。 遇到的问题 双向绑定 在Vue中&#xff0c;v-model提供了方便的双向绑定功能&#xff0c;它是modelValue属性和onUpdate:m…...

10.9作业

1、鼠标和键盘事件 #include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QMouseEvent>widget::widget(QWidget *parent): QWidget(parent), ui(new Ui::widget) {ui->setupUi(this);this->setWindowFlag(Qt::Fram…...

Go 语言中的错误和异常:设计理念与优势

Go 语言中的错误和异常&#xff1a;设计理念与优势 在软件开发中&#xff0c;错误处理是一个至关重要的环节。不同的编程语言对于错误和异常的处理方式各有不同。Go 语言将错误和异常进行了明确区分&#xff0c;这种设计理念带来了许多独特的优势。本文将深入探讨 Go 语言中错误…...

sqli-labs less-20 less-21 less-22 cookie注入

COOKIE 作用&#xff1a;是由网络服务器存储在你电脑硬盘上的一个txt类型的小文件&#xff0c;它和你的网络行为有关&#xff0c;记录了当前用户的状态 形式&#xff1a;keyvalue 例如&#xff1a;当我们登录某个账号后&#xff0c;服务器会在cookies进行记录 个人理解&#xf…...

IDEA下“File is read-only”可能原因及“找不到或无法加载主类”问题的解决

1.File is read-only”可能原因 写代码时想要修改这个静态变量的值&#xff0c;把这个语句注释掉&#xff0c;发现在这个文件中File is read-only无法编辑修改&#xff0c;于是想去掉这个状态 网上查看的解释大多是在File栏目或File->File Properties下可以找到Make File W…...

MySQL【知识改变命运】03

表的基本操作 1&#xff1a;查看所有表2&#xff1a;创建表3&#xff1a;查看表结构4&#xff1a;修改表5&#xff1a; 删除表 前言&#xff1a;我们先了解一个知识&#xff1a; MySQL安装后会有MySQL服务——管理多个库——每个库管理多个表——每个表管理多行数据——数据行由…...

【测试】BUG篇——BUG

bug的概念 定义&#xff1a;⼀个计算机bug指在计算机程序中存在的⼀个错误(error)、缺陷(flaw)、疏忽(mistake)或者故障(fault)&#xff0c;这些bug使程序⽆法正确的运⾏。Bug产⽣于程序的源代码或者程序设计阶段的疏忽或者错误。 准确的来说&#xff1a; 当且仅当规格说明&am…...

【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现

高阶数据结构相关知识点可以通过点击以下链接进行学习一起加油&#xff01; 本章是高阶数据结构笔记的第一篇文章&#xff0c;将分享二叉搜索树的进阶概念及其高效实现的相关知识&#xff0c;欢迎大家阅读&#xff01; &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f3…...

上传本地项目到GitHub远程仓库(极简洁操作版)

第一步&#xff1a;在GitHub创建一个空的仓库 第二步&#xff1a;将仓库克隆&#xff08;下载&#xff09;到本地 第三步&#xff1a;将你要上传的所有文件放到这个克隆的仓库文件夹中 第四步&#xff1a;通过git add .将待上传文件添加到暂存区 此时&#xff0c;可以通过git …...

在安卓中使用 `mobile-ffmpeg` 压缩后的视频,浏览器在线播放提示“没有找到支持的视频格式和 MIME 类型”的解决方案

在安卓中使用 mobile-ffmpeg 压缩后的视频&#xff0c;浏览器在线播放提示“没有找到支持的视频格式和 MIME 类型”的解决方案 你可能在安卓开发中使用了 mobile-ffmpeg 进行视频压缩&#xff0c;而当你尝试在浏览器中在线播放压缩后的视频时&#xff0c;看到提示&#xff1a;…...

C语言指针plus版练习

上期我们讲了进阶的指针&#xff0c;本期内容我们来强化一下上期学的内容 一、字符串左旋 实现一个函数&#xff0c;可以左旋字符串中的k个字符。 1.1 分析题目 假设字符串为abcde&#xff0c;左旋一个以后就变成bcdea&#xff0c;就是把第一个字符移到一个新的变量里面&#…...

Kafka 快速入门

目录 介绍 KafKa 相关术语 ​编辑 Kafka的工作流程 生产者向kafka发送数据的流程 Kafka选择分区的模式 Kafka选择分区的模式 数据消费 kafka的文件存储机制 topic、partition和segment 存储和查找message的过程 数据写入过程 数据查找过程 注意事项 kafka管理UI …...

探索人们最喜爱的AI工具及其应用影响

探索人们最喜爱的AI工具及其应用影响 在科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正在改变我们的生活和工作方式。越来越多的人开始使用AI工具来提高效率、简化流程和推动创新。那么&#xff0c;在众多的AI工具中&#xff0c;哪些是人们最喜欢的…...

c语言位域详解

一、什么是位域 位域是一种可以让结构体的成员变量以位为单位进行存储和操作的特性。位域允许我们精确控制数据的存储方式&#xff0c;而不像普通的整型变量那样固定使用系统规定的字节大小。 通过位域&#xff0c;我们可以在一个整型数据中指定具体的位数来表示某些信息。比…...

如何修改Spring Boot内置容器默认端口

默认情况下&#xff0c;Spring Boot 应用程序在嵌入式 Tomcat 服务器上启动&#xff0c;并监听默认端口 8080。如果您需要将默认的嵌入式服务器端口更改为其他端口号&#xff0c;可以使用以下几种方法之一&#xff1a; 嵌入式服务器配置命令行参数属性文件 在代码里以编程方式…...

STM32自动下载电路分享及注意事项

文章目录 简介ISP下载启动配置 USB转串口芯片CH340C手动isp下载自动isp下载RTS、DTR电平变化分析注意事项 简介 在嵌入式开发中&#xff0c;使用STM32下载程序&#xff0c;可以通过仿真器下载&#xff0c;也可以通过串口下载。在stm32串口下载时&#xff0c;我们需要手动配置启…...

2026届学术党必备的十大AI辅助写作助手解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek “降AI”是要借助技术手段&#xff0c;去降低文本里人工智能生成内容的可识别程度&#xff0…...

利用快马ai快速构建基于jdk 17的spring boot web应用原型

最近在尝试快速搭建一个基于JDK 17的Spring Boot Web应用原型&#xff0c;发现用传统方式从零开始配置环境、搭建框架特别耗时。特别是JDK版本兼容性问题和依赖配置&#xff0c;经常要折腾半天。后来尝试了InsCode(快马)平台&#xff0c;整个过程变得异常简单&#xff0c;分享下…...

从CNN到Mamba:为什么这个轻量级双分支结构在医学图像分类中表现更好?

从CNN到Mamba&#xff1a;轻量级双分支结构如何重塑医学图像分类范式 医学影像分析正面临前所未有的挑战——随着CT、MRI、超声等成像技术的普及&#xff0c;每天产生的医学图像数据呈指数级增长。传统CNN架构在应对高分辨率医学图像时&#xff0c;往往陷入局部特征提取的局限&…...

终极中文语义理解指南:text2vec-base-chinese如何让AI真正读懂中文

终极中文语义理解指南&#xff1a;text2vec-base-chinese如何让AI真正读懂中文 【免费下载链接】text2vec-base-chinese 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/text2vec-base-chinese 还在为中文文本相似度计算而烦恼吗&#xff1f;text2vec-base-c…...

手把手教你用Python+Folium搭建离线地图应用(附高德瓦片下载技巧)

PythonFolium离线地图开发实战&#xff1a;从瓦片下载到内网部署全指南 当你在偏远山区进行地质勘探时&#xff0c;突然发现手机信号全无&#xff0c;而团队急需查看预设路线上的地形数据&#xff1b;或者在企业内网环境中&#xff0c;安全策略禁止访问外部地图服务&#xff0c…...

WHUCS—OS—lab实验:从零实现一个用户态定时器

1. 用户态定时器实现原理 在操作系统中&#xff0c;定时器是一个非常重要的基础功能。想象一下你每天早上依赖的闹钟 - 它会在特定时间准时响起&#xff0c;提醒你该起床了。用户态定时器的工作原理与此类似&#xff0c;只不过它是在程序运行时提供定时提醒功能。 xv6作为一个…...

详解bat脚本:语法、常见用法、注意事项、示例

文章目录前言1.什么是BAT 脚本2.基本语法2.1 注释2.2 基本命令执行3.常用命令详解4.变量使用1. 定义变量2. 使用变量&#xff08;要用 % 括起来&#xff09;5.流程控制5.1 if 条件判断基本语法&#xff1a;常用比较&#xff1a;示例&#xff1a;5.2 for 循环遍历文件&#xff0…...

如何永久保存微信聊天记录?这款免费工具让你真正拥有自己的数字记忆

如何永久保存微信聊天记录&#xff1f;这款免费工具让你真正拥有自己的数字记忆 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Tren…...

nRF52832蓝牙开发实战:手把手教你配置广播与扫描(基于SES和nRF5 SDK 15.3)

nRF52832蓝牙开发实战&#xff1a;从零配置广播与扫描全流程解析 在物联网设备开发中&#xff0c;蓝牙低功耗&#xff08;BLE&#xff09;技术因其低功耗、低成本的特点成为连接智能设备的首选方案。作为Nordic Semiconductor的明星产品&#xff0c;nRF52832凭借其强大的处理能…...

用Matlab模拟大气湍流和相机抖动:从模糊照片到清晰图像的完整复原实战

用Matlab模拟大气湍流和相机抖动&#xff1a;从模糊照片到清晰图像的完整复原实战 当你在高空航拍或长焦拍摄时&#xff0c;是否遇到过图像模糊不清的问题&#xff1f;这种模糊往往源于大气湍流或相机抖动。本文将带你深入理解这些退化现象的数学模型&#xff0c;并手把手教你用…...