【C语言】--指针超详解(一)
目录
一.内存和地址
1.1--内存
1.2--如何理解编址
二.指针变量和地址
2.1--取地址操作符(&)
2.2--指针变量和解引用操作符(*)
2.2.1--指针变量
2.2.2--如何理解指针类型
2.2.3--解引用操作符
2.3--指针变量的大小
三.指针变量类型的意义
3.1--从指针的解引用方面看
3.2--从指针加减整数方面看
3.3--void * 指针
四.指针运算
4.1--指针加减整数
4.2--指针减指针
4.3--指针的关系运算
前言:从这篇文章开始,笔者将要开始更新指针系列的知识分享,这一块也是C语言学习中的重难点,希望能给大家带来一些帮助,一起学习进步
一.内存和地址
--提到指针,我们就先需要对内存和地址有一定的了解,理清这两者和指针之间的关系。
1.1--内存
--我们生活中的许多事情都离不开编号,比如我说我们刚开学想找到自己的宿舍,如果不知道宿舍的门牌号的话,就很麻烦了,而有了门牌号,我们就可以快速找到宿舍的地址。那么同理,在计算机上我们如果想要高效的管理内存空间的话,其实也是把内存划分为一个个的内存单元(它们也有自己的编号),每个内存单元的大小取1字节。
在这里先补充一下计算机中的常见单位:一个比特位可以存储一个二进制的位1或者0
1.bit--比特 1Byte=8bit
2.Byte--字节 1KB=1024Byte
3.KB 1MB=1024KB
4.MB 1GB=1024MB
5.GB 1TB=1024GB
6.TB 1PB=1024TB
7.PB
我们可以把每个内存单元理解为一个学生宿舍
一个字节空间里面可以存放8个比特位,就好比一个宿舍住了8个人一样,每个人都是一个比特位。 每个内存单元又都有一个编号(这个编号就相当于宿舍房间的门牌号),有了这个内存单元的编号,CPU就可以快速找到一个内存空间。 在生活中,我们把门牌号叫做地址,在计算机我们把内存单元的编号也叫做地址。C语言中给地址起了新的名字叫做指针。 所以我们可以这样理解: 内存单元的编号==地址==指针
1.2--如何理解编址
--计算机中各个硬件单元都是要互相协同工作的,但硬件与硬件之间又是相互独立的,所以硬件与硬件之间的协同工作是用一个个线连起来的 ,今天主要介绍的是地址总线。
CPU访问内存中的某个字节空间,必须知道这个字节空间在内存的什么位置,而因为内存中字节很多,所以需要给内存进行编址。 计算机中的编址,并不是把每个字节的地址记录下来,而是通过硬件设计完成的。我们可以简单理解为,32位机器有32根地址总线,每根线只有两态,表示0,1【电脉冲有无】,那么一根线能表示两种含义,2根线就是4中。依次类推32根地址线就能表示2^32种含义,每一种含义都代表一个地址。 整体过程大概就是控制总线下达一个命令,地址信息通过地址总线被下达给内存,在内存上就可以找到该地址对应的数据,最后将数据通过数据总线传入CPU内寄存器。
二.指针变量和地址
2.1--取地址操作符(&)
--理解了内存和地址的关系,我们再回到C语言中,在C语言中创建变量其实就是向内存申请空间,比如:
#include <stdio.h>
int main()
{int a = 10;return 0;
}
上述的代码就是创建了整型变量a,内存中申请4个字节,用于存放整数10,其中每个字节都有地址,那我们该如何得到a的地址呢,这里我们就需要取地址操作符(&)了。
#include <stdio.h>
int main()
{int a = 10;&a;//取出a的地址printf("%p\n", &a);return 0;
}
按上述代码执行后,&a取出的是a所占字节中地址较小的字节的地址,所以打印出来也是地址较小字节的地址。虽然整型变量占用4个字节,但我们只需要知道了第一个字节地址,顺藤摸瓜访问到4个字节的数据也是可行的。
2.2--指针变量和解引用操作符(*)
2.2.1--指针变量
--我们通过取地址操作符(&)拿到的地址是一个数值,这个数值我们有时需要存储起来,方便后期使用,这个时候就得用上指针变量了。 比如:
#include <stdio.h>
int main()
{int a = 10;int* pa = &a;//取出a的地址并存储到指针变量pa中return 0;
}
指针变量也是一种变量,这种变量就是用来存放地址的 ,存放在指针变量中的值都会理解为地址。
2.2.2--如何理解指针类型
我们看到指针变量的类型是int*,我们该如何理解指针的类型呢?
int a = 10;
int * pa = &a;
这里pa左边写的是int*,*说明了pa是指针变量,而前面的int是在说明pa指向的是整型类型的对象
同样的,如果有一个char类型的变量ch,ch的地址我们就可以用char * pc = &ch来存起来。其他类型也是同样的道理。
2.2.3--解引用操作符
--我们将地址保存之后,那我们怎么去使用他呢,这里我们就需要解引用操作符(*)了。
#include <stdio.h>
int main()
{int a = 100;int* pa = &a;*pa = 0;return 0;
}
上述代码就使用了解引用操作符,*pa的意思就是就是通过指针变量pa中存放的地址,找到指向的空间,*pa其实就是a变量了;所以*pa=0,这个操作就是把a改成了0;
那么我们为什么不直接修改a呢,还非要运用指针,其实这里把a的修改的操作交给了pa,这样就多了一种途径,写代码也更加灵活。
2.3--指针变量的大小
--从前面的内容我们可以了解到,32位机器假设有32根地址总线,每根地址总线出来的电信号转换成数字信号后是1或者0,那我们把32根地址线产生的2进制序列当做一个地址,那么一个地址就是32个bit位,需要4个字节才能存储。如果指针变量是用来存放地址的,那么指针变量的大小就得是4个字节的空间才可以,同理,如果是64位机器,指针变量的大小就是8个字节。
#include <stdio.h>
//指针变量的⼤⼩取决于地址的⼤⼩
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)int main()
{printf("%zd\n", sizeof(char*));printf("%zd\n", sizeof(short*));printf("%zd\n", sizeof(int*));printf("%zd\n", sizeof(double*));return 0;
}
我们将这串代码分别放在X86和X64环境运行一下,可以发现一个全是4,一个全是8。
结论:
- 32位平台下地址是32个bit位,指针变量的大小是4个字节
- 64位平台下地址是64个bit位,指针变量的大小是8个字节
- 指针变量的大小和类型无关,只要是指针类型的变量,在相同的平台下,大小都是相同的。
三.指针变量类型的意义
--在上面的学习中我们知道了指针变量的大小和类型无关,那为什么还有各种各样的指针类型呢,其实指针类型是有其特殊意义的,我们接着往下看把。
3.1--从指针的解引用方面看
--我们对比下面两串代码,在调试时观察其内存的变化
//代码1
#include <stdio.h>
int main()
{int n = 0x11223344;int* pi = &n;*pi = 0;return 0;
}//代码2
#include <stdio.h>
int main()
{int n = 0x11223344;char* pc = (char*)&n;*pc = 0;return 0;
}
通过调试观察其内存变化我们可以发现,代码1会将n的4个字节全部改为0,但是代码2只是将你的第一个字节改为0.
结论:指针的类型决定了对指针解引用的时候有多大权限(一次能操作几个字节)。
比如:从上面的例子可以知道,char*的指针解引用就只能访问1个字节,而int*的指针解引用就能访问4个字节
3.2--从指针加减整数方面看
--我们直接通过一串代码,运行起来观察其地址的变化来直观感受一下。
#include <stdio.h>
int main()
{int n = 10;printf("%p\n", &n);char* pc = (char*)&n;printf("char * 类型\n");printf("%p\n", pc);printf("%p\n", pc + 1);int* pi = &n;printf("int * 类型\n");printf("%p\n", pi);printf("%p\n", pi + 1);return 0;
}
代码运行结果如下:
我们可以看出,char*类型的指针变量+1跳过一个字节,int*类型的指针变量+1跳过了4个字节。这就是指针变量类型差异带来的变化。指针+1,其实就是跳过1个指针指向的元素。指针可以+1,那也可以-1。
结论:指针的类型决定了指针向前或者向后走一步有多大(距离)。
3.3--void * 指针
--在指针类型中有一种特殊的类型是void*类型的,可以理解为无具体类型的指针(或者叫泛型指针),这种类型的指针可以用来接受任意类型地址。但是也有局限性,void*类型的指针不能直接进行指针的+-整数和解引用的运算。
举例:
#include <stdio.h>
int main()
{int a = 10;int* pa = &a;char* pc = &a;//errreturn 0;
}
在上面的代码中,将一个int类型的变量地址赋值给一个char*类型的指针变量。编译器给出了一个警告(如下图),是因为类型不兼容。但是用void*类型就不会有这样的问题了。
使用void*类型的指针接收地址:
#include <stdio.h>
int main()
{int a = 10;void* pa = &a;void* pc = &a;*pa = 10;//err*pc = 0;//errreturn 0;
}
运行代码的结果:
从这里我们可以看到,void*类型的指针可以接收不同类型的地址,但无法直接进行指针运算。
那void*指针到底有啥用呢,一般void*类型的指针是使用在函数参数的部分,用来接受不同类型数据的地址,这样的设计可以实现泛型编程的效果,使得一个函数来处理多种类型的数据,这个在后续的指针超详解篇中会给大家分享。
四.指针运算
指针的基本运算有三种:
- 指针+-整数
- 指针-指针
- 指针的关系运算
4.1--指针加减整数
--我们直接举个例子看看吧,因为数组在内存中是连续存放的,只要知道第一个元素的地址,顺藤摸瓜就可以找到后面的所有元素,所以可以运用指针加减整数来实现顺序和逆序打印数组中的所有元素。
#include <stdio.h>
//指针+- 整数
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = &arr[0];int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; i++){printf("%d ", *(p + i));//p+i 这⾥就是指针+整数}return 0;
}
大家可以自己下去尝试一下逆序打印和用指针+-整数实现strlen函数等问题,体会指针加减整数是如何运用的。
4.2--指针减指针
--【指针-指针】的绝对值得到的是两个指针之间的元素个数
前提:两个指针指向了同一块空间,否则不能相减
我们来看一个用指针-指针实现strlen函数作用的代码吧:
//指针-指针
#include <stdio.h>
int my_strlen(char* s)
{char* p = s;while (*p != '\0')p++;return p - s;
}
int main()
{printf("%d\n", my_strlen("abc"));return 0;
}
4.3--指针的关系运算
--我们直接用指针的关系运算打印数组元素这个例子来直观感受一下吧:
#include <stdio.h>int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = &arr[0];int sz = sizeof(arr) / sizeof(arr[0]);while (p < arr + sz) //指针的⼤⼩⽐较{printf("%d ", *p);p++;}return 0;
}
结语:本篇文章就到此结束,对指针这块内容感兴趣的朋友可以期待一下后续的指针相关知识分享,感谢大家的关注和支持。
相关文章:
【C语言】--指针超详解(一)
目录 一.内存和地址 1.1--内存 1.2--如何理解编址 二.指针变量和地址 2.1--取地址操作符(&) 2.2--指针变量和解引用操作符(*) 2.2.1--指针变量 2.2.2--如何理解指针类型 2.2.3--解引用操作符 2.3--指针变量的大小 三.指针变量类型的意义 3.1--从指针的解引用方…...
高频工业RFID读写器-三格电子
高频工业RFID读写器 型号:SG-HF40-485、SG-HF40-TCP 产品功能 高频工业读写器(RFID)产品用在自动化生产线,自动化分拣系统,零部件组装产线等情境下,在自动化节点的工位上部署RFID读写设备,通过与制品的交互…...
驱动开发系列57 - Linux Graphics QXL显卡驱动代码分析(四)显示区域绘制
一:概述 前面在介绍了显示模式设置(分辨率,刷新率)之后,本文继续分析下,显示区域的绘制,详细看看虚拟机的画面是如何由QXL显卡绘制出来的。 二:相关数据结构介绍 struct qxl_moni…...
6.5 行业特定应用:金融、医疗、制造等行业的定制化解决方案
金融、医疗和制造行业作为全球经济支柱,面临数据复杂性、实时性需求和严格合规性的共同挑战,同时各行业因业务特性衍生出独特需求。金融行业需应对市场波动、欺诈风险和多国法规,医疗行业聚焦精准诊断和患者数据隐私,制造业则强调…...
【Linux我做主】深入探讨从冯诺依曼体系到进程
从冯诺依曼体系到进程 从冯诺依曼体系到进程github地址1. 前言2. 计算机硬件2.1 冯诺依曼体系结构2.2 冯诺依曼模型的三大要点2.3 从QQ聊天认识:冯诺依曼体系下数据是如何流动的?发送方数据流动接收方数据流动 3. 计算机软件的根基——操作系统3.1 操作系…...
idea更换jdk版本操作
有时候我们有更换jdk版本的问题,自己电脑可能有多个版本,下面来介绍修改jdk版本修改修改什么地方 1 2 3 4 5 6 再修改pom即可,还有环境变量即可,希望有帮到大家!...
npm install下载插件无法更新package.json和package-lock.json文件的解决办法
经过多番查证,使用npm config ls查看相关配置等方式,最后发现全局的.npmrc文件的配置多写了globaltrue,去掉就好了 如果参数很多,不知道是哪个参数引起的,先只保留registryhttp://xxx/,试试下载࿰…...
机器学习实操 第二部分 神经网路和深度学习 第13章 使用TensorFlow加载和预处理数据
机器学习实操 第二部分 神经网路和深度学习 第13章 使用TensorFlow加载和预处理数据 内容概要 第13章深入探讨了如何使用TensorFlow加载和预处理数据。本章首先介绍了tf.data API,它能够高效地加载和预处理大规模数据集,支持并行文件读取、数据打乱、批…...
WebSoket的简单使用
一、WebSocket简介 1.1、双向通信/全双工 客户端和服务器之间同时双向传输,全双工通信允许客户端和服务器随时互相发送消息,不需等一方发送请求后另一方才进行响应。 适用要低延迟/实时交互的场景,如在线游戏、即时通讯、股票行情等。 1.2…...
01_线性表
一、线性表的顺序存储 逻辑上相邻的数据元素,物理次序也相邻。占用连续存储空间,用“数组”实现,知道初始位置就可推出其他位置。 00_宏定义 // 函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #defin…...
STL详解 - map和set
目录 一、关联式容器概述 二、键值对 三、树形结构的关联式容器 (一)set 1. set的介绍 2. set的使用 (1)模板参数列表 (2)构造函数 (3)迭代器函数 (4ÿ…...
SpringBoot 集成滑块验证码AJ-Captcha行为验证码 Redis分布式 接口限流 防爬虫
介绍 滑块验证码比传统的字符验证码更加直观和用户友好,能够很好防止爬虫获取数据。 AJ-Captcha行为验证码,包含滑动拼图、文字点选两种方式,UI支持弹出和嵌入两种方式。后端提供Java实现,前端提供了php、angular、html、vue、u…...
高并发PHP部署演进:从虚拟机到K8S的DevOps实践优化
一、虚拟机环境下的部署演进 1. 低并发场景(QPS<10)的简单模式 # 典型部署脚本示例 ssh userproduction "cd /var/www && git pull origin master" 技术痛点: 文件替换期间导致Nginx返回502错误(统计显示…...
vue引入物理引擎matter.js
vue引入物理引擎matter.js 在 Vue 项目中集成 Matter.js 物理引擎的步骤如下: 1. 安装 Matter.js npm install matter-js # 或 yarn add matter-js2. 创建 Vue 组件 <template><div ref="physicsContainer" class="physics-container"><…...
【实战项目】简易版的 QQ 音乐:一
> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:能自我实现简易版的 QQ 音乐。 > 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安! > 专栏选自:…...
部署Superset BI(三)连接HANA数据库
metabase和redash都不支持HANA数据库,选择superset就是看重这一点,开始尝试连接HANA数据库。 按Superset的技术文档:pip install hdbcli sqlalchemy-hana or pip install apache-superset[hana] --进入容器 rootNocobase:/usr/superset/supe…...
快速学会Linux的WEB服务
一.用户常用关于WEB的信息 什么是WWW www是world wide web的缩写,及万维网,也就是全球信息广播的意思 通常说的上网就是使用www来查询用户所需要的信息。 www可以结合文字、图形、影像以及声音等多媒体,超链接的方式将信息以Internet传递到世…...
如何搭建spark yarn模式集群的集群
以下是搭建 Spark YARN 模式集群的一般步骤: 准备工作 确保集群中各节点已安装并配置好 Java 环境,且版本符合 Spark 要求。规划好集群中节点的角色,如 Master 节点、Worker 节点等,并确保各节点之间网络畅通,能相互…...
端口安全基本配置
1.top图 2.交换机配置 交换机swa <SWA> system-view [SWA] vlan batch 10 20[SWA] interface GigabitEthernet0/0/1 [SWA-GigabitEthernet0/0/1] port link-type trunk [SWA-GigabitEthernet0/0/1] port trunk allow-pass vlan 10[SWA] interface GigabitEthernet0/0/2 …...
【JsonCpp、Muduo、C++11】JsonCpp库、Muduo库、C++11异步操作
JsonCpp库、Muduo库、C11异步操作 1. JsonCpp库1.1 Json数据格式1.2 JsonCpp介绍1.3 JsonCpp使用 2. Muduo库2.1 Muduo库常见接口介绍2.1.1 TcpServer类基础介绍2.1.2 EventLoop类基础介绍2.1.3 TcpConnection类基础介绍2.1.4 Buffer类基础介绍2.1.5 TcpClient类基础介绍 2.2 M…...
【自然语言处理与大模型】LlamaIndex的词嵌入模型和向量数据库
(1)嵌入模型的定义和作用 嵌入模型(Embedding Model)的本质在于将高维的、稀疏的数据转换为低维的、密集的向量表示,使得这些向量能够在数学空间中表达原始数据的语义信息。作用如下: 降维表示:…...
SLAM算法工程师面经大全:2025年面试真题解析与实战指南
SLAM算法工程师面经大全:2025年面试真题解析与实战指南 一、SLAM技术概述与核心原理 1.SLAM基础理论框架 SLAM算法的核心在于同步定位与建图,这一过程涉及传感器数据融合、运动建模与优化方法。在传感器数据融合方面,不同类型的…...
虚拟现实视频播放器 2.6.1 | 支持多种VR格式,提供沉浸式观看体验的媒体播放器
虚拟现实媒体播放器是一款专为在智能手机上播放VR(虚拟现实)照片和视频而设计的应用程序。它支持多种格式的影像内容,包括360和180等距矩形柱面、标准镜头和鱼眼镜头拍摄的照片和视频,并且兼容3D立体并排、上/下以及收缩媒体格式。…...
从黔西游船侧翻事件看极端天气预警的科技防线——疾风气象大模型如何实现精准防御?
近日,贵州省黔西市一起载人游船侧翻事故令人痛心。调查显示,事发时当地突遇强风暴雨,水面突发巨浪导致船只失控。这一事件再次凸显:在极端天气频发的时代,传统“经验式防灾”已不足够,唯有依靠智能化的气象预警技术,才能筑牢安全底线。 极端天气预警的痛点:为什么传统方…...
颠覆监测体验!WM102无线温湿度记录仪开启智能物联新时代
当温湿度失控成为企业隐形成本杀手,您是否还在用传统设备疲于应对?一款集智能、精准、全能于一身的神器横空出世——WM102无线温湿度记录仪,用硬核科技重新定义环境监测! ▌5大场景痛点 一招破解 无论是医药冷库里的疫苗守护战&am…...
Linux云服务器配置git开发环境
文章目录 1. 安装 git2. git clone3. git add .4. git commit -m 提交记录5. git push🍑 异常原因🍑 解决办法 6. git pull7. git log8. git rm9. git mv10. git status 1. 安装 git sudo yum install git -y2. git clone 此命令的作用是从远程仓库把代…...
山东大学软件学院项目实训-基于大模型的模拟面试系统-个人主页头像上传
采用图床的方案,存储用户头像。 实现步骤 引入OSS依赖 在我们的SpringBoot项目中引入OSS依赖 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.10.2</version> &l…...
AI智能体|扣子(Coze)实战【天气查询插件开发教程】
大家好,我是偶然,AI洞察,AI智能体,AI实战案例分享 今天教大家用 Coze 开发一个天气插件,本来我是想教大家怎么用 AI 写代码节点实现节点功能的,但是我感觉太复杂了。 起码来说,我还没做到用特别…...
VBA ListBox/ComboBox 响应鼠标滚轮操作
一般情况下,在Excel的vba窗口中,我们是无法使用鼠标滚轮控制例如 ListBox 和 ComboBox 控件的。我们只能通过鼠标点击的方式来逐个选择选项。 我们都知道,通过鼠标滚轮快速的上下滚动候选项,以快速的定位选择选项,这是…...
Linux 更改内存交换 swap 为 zram 压缩,减小磁盘写入
1、查看当前 swap 的方式 swapon --show 我这里是默认的 swap 文件,大小为 2G。 2、安装 zram Ubuntu 下: sudo apt install zram-tools安装后默认会启动: 3、关闭默认的 swap 文件 sudo swapoff /swapfile 其次是关闭 /etc/fstab 中的 …...
TypeScript简介
🌟 TypeScript入门 TypeScript 是 JavaScript 的超集,由微软开发并维护,通过静态类型检查和现代语言特性,让大型应用开发变得更加可靠和高效。 // 一个简单的 TypeScript 示例 interface User {name: string;age: number;greet():…...
Facebook如何运用AI实现元宇宙的无限可能?
引言 元宇宙(Metaverse)是一个虚拟的、由多个 3D 虚拟世界组成的网络,用户可以在其中进行互动、游戏、工作和社交。Facebook 作为全球最大的社交媒体平台之一,对元宇宙的构建和实现有着深远的影响。通过运用人工智能(…...
【大语言模型ChatGPT+Python】近红外光谱数据分析及机器学习与深度学习建模(近红外光谱数据分析、定性/定量分析模型代码自动生成等)
近红外光谱数据分析是一种重要的分析技术,广泛应用于化学、食品、制药、农业、环境科学等领域。以下是关于近红外光谱数据分析的详细介绍: 一、基本原理 近红外光谱的范围 近红外光谱是指波长范围在780 - 2500纳米的电磁辐射。在这个波段,分子…...
ArcGIS Pro图斑属性自动联动更新-在线卫星底图图斑采集
今天介绍一下在ArcGIS Pro图斑属性自动联动更新 主要介绍内容: 1、ArcGIS Pro数据设计中属性规则的设置,实现图斑属性的自动更新与联动更新。 2、介绍ArcGIS Pro不能新建要素类图层的原因 3、包括新建字段等内容 4、deepseek查询arcade计算图斑面积语…...
OpenHarmony GPIO应用开发-LED
学习于: https://docs.openharmony.cn/pages/v5.0/zh-cn/device-dev/driver/driver-platform-gpio-develop.md https://docs.openharmony.cn/pages/v5.0/zh-cn/device-dev/driver/driver-platform-gpio-des.md 通过OpenHarmony官方文档指导可获知:芯片厂…...
C语言结构体内存对齐使用场景
#pragma pack(push, 1) 和 #pragma pack(pop) 的使用场景(C语言) 这两个预处理指令用于控制结构体成员的内存对齐方式,主要在以下场景中使用: 主要使用场景 网络通信协议处理 当需要精确控制结构体布局以匹配网络协议格式时 确…...
极速轻量,Rust 网络开发新选择:Hyperlane 框架深度解析
极速轻量,Rust 网络开发新选择:Hyperlane 框架深度解析 在高性能网络服务开发领域,Rust 凭借其内存安全与高效并发的特性备受青睐。今天,我们迎来一款专为现代 Web 服务打造的明星框架——Hyperlane,它以“轻量高效、…...
从零开始学习人工智能(Python高级教程)Day6-Python3 正则表达式
一、Python3 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。 在 Python 中,使用 re 模块来处理正则表达式。 re 模块提供了一组函数,允许你在字符串中进行模式匹配、搜索和替换操作。 r…...
UKCC(原OUCC)真题讲解(一)
题目链接:PRACTICE - 2025 Coding Challenge - UK Bebras 1.GreenStar 方法:使用模块 参考答案: 【知识点】 这里的长度100,是指中心到角的距离。 2.Draw a Square 参考答案: 【知识点】 在正多边形的图案中&#…...
Linux——特殊权限管理
Linux中的特殊权限(setuid、setgid、sticky bit)扩展了基本的文件权限机制,提供了更精细的控制。以下是详细说明: 1. SetUID(SUID) 作用:允许用户以文件所有者的权限执行文件。 例如:…...
Ubuntu18.04搭建samda服务器
一.什么是Samba服务器? Samba服务器是一种基于开源协议实现的网络共享服务软件,主要用于在不同操作系统(如Windows、Linux、Unix)之间实现文件和打印机共享功能。其核心目标是解决跨平台资源共享的兼容性问题,尤其是在…...
vue3搭建后台管理系统
找menu菜单 上部用height设置高度和背景颜色 需要自己改左侧栏的边线 将el-menu的border设置为0,然后上方设置border-right设置边框 设置右边 创建data.vue input组件 导入icon图标 引入import 一个template 设置个card el-card 定义card 加el-button查询 el-table表单 …...
[学习]RTKLib详解:pntpos.c与postpos.c
文章目录 RTKLib详解:pntpos.c与postpos.cPart A: pntpos.c一、概述二、整体工作流程三、主要函数说明1. pntpos()2. satposs()3. estpos()4. rescode()5. prange()6. ionocorr()7. tropcorr()8. valsol()9. raim_fde()10. estvel() 四、函数调用关系图(…...
64.微服务保姆教程 (七) RocketMQ--分布式消息中间件
RocketMQ–分布式消息中间件 一、MQ 1、什么是MQ MQ(Message Queue)消息队列,是基础数据结构中“先进先出”的一种数据结构。指把要传输的数据(消息)放在队列中,用队列机制来实现消息传递——生产者产生消息并把消息放入队列,然后由消费者去处理。消费者可以到指定队…...
邀约媒体,邀请到场 多少钱?
传媒如春雨,润物细无声,大家好,我是51媒体胡老师。 在策划线下活动时,媒体邀约是提升品牌曝光度和影响力的重要环节。不同类型和规模的媒体邀约,其预算需求也各不相同。以下为各类媒体邀约的费用概览及影响因素&#…...
Android数据库全栈开发实战:Room+SQLCipher+Hilt企业级应用构建
简介 在移动应用开发中,数据库作为数据存储的核心组件,其安全性和性能对企业级应用至关重要。本文将从零开始,全面讲解Android数据库开发的最新技术,包括Room框架的深度使用、SQLCipher加密数据库的实现、Hilt依赖注入的集成以及前后端数据同步的完整方案。通过一个加密任…...
Kafka与RocketMQ在事务消息实现上的区别是什么?
一、Kafka事务消息核心实现(基于2.8版本) // KafkaProducer.java public synchronized Future<RecordMetadata> send(ProducerRecord<K, V> record) {// 事务消息校验(第256行)if (transactionManager ! null &&…...
Maven 依赖发布与仓库治理
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
hybird接口配置
【sw1】 [sw1]vlan batch 10 20 [sw1]int g 0/0/3 [sw1-GigabitEthernet0/0/1]port hybrid tagged vlan 10 20 [sw1-GigabitEthernet0/0/1]int g 0/0/1 [sw1-GigabitEthernet0/0/2]port hybrid pvid vlan 10 [sw1-GigabitEthernet0/0/2]port hybrid untagged vlan 10 20 …...
AI视频智能分析网关打造社区/工厂/校园/仓库智慧消防实现精准化安全管控
一、背景 随着社区、商业场所对消防安全要求日益提升,传统消防系统已难以满足智能化、精细化管理需求。智能分析网关融合物联网与人工智能技术,具备强大的数据处理与分析能力,可全面升级消防系统。将其融入消防系统各层级,搭建智…...