js应用opencv

思路:
第一步:直方图
第二步:获得直方图的波峰
第三步:波峰胜负10,高于或低于变红色

1.引用import cv from ‘@techstark/opencv-js’;
2.vue代码

 <div class="historyLeft2"><div style="relative: display" v-for="(item, index) in dataReturns3"><el-row><el-col :span="16"><canvas v-if="index === 0" ref="myCanvas" width="230" height="230"></canvas></el-col><el-col :span="8" style="text-align: left;"><el-buttonv-if="tiancongflag==0"type="success" style="margin-top:10px; margin-left:15px; font-size:14px;"size="small"@click="tiancong"round>填充缺陷</el-button><el-buttonv-if="tiancongflag === 1"type="warning" style="margin-top:10px;margin-left:15px;font-size:14px;"size="small"@click="tiancong"round>取消填充</el-button></el-col></el-row></div></div>

3.js代码

 processBase64Image(base64Data) {const img = new Image();img.onload = () => {if(this.tiancongflag == 1){this.processImage(img);}else{this.processImage2(img);}};console.log(444)img.src = base64Data;},processImage(img) {console.log(img)this.$nextTick(() => {const canvas = this.$refs.myCanvas;const ctx = canvas[0].getContext('2d');var canvasWidth = canvas[0].width;var canvasHeight = canvas[0].height;var imgWidth = img.width;var imgHeight = img.height;var imgYOffset = 20;// 计算宽高比和缩放比例var scaledWidth = 0;var scaledHeight = 0;if (imgWidth > imgHeight) {scaledWidth = 190;scaledHeight = Math.floor(scaledWidth * (imgHeight/imgWidth));} else {scaledHeight = 210;scaledWidth = Math.floor(scaledHeight * (imgWidth/imgHeight));}// 清除 Canvas// ctx.clearRect(0, 0, canvasWidth, canvasHeight);ctx.fillStyle = '#081c31';ctx.strokeStyle = '#081c31';ctx.fillRect(0, 0, canvasWidth, canvasHeight);var x = Math.floor((210 - scaledWidth) / 2);var y = Math.floor((210 - scaledHeight) / 2);ctx.drawImage(img, x, y+imgYOffset, scaledWidth, scaledHeight);// 读取图像const src = cv.imread(canvas[0]);// 创建一个目标矩阵用于灰度图像var gray = new cv.Mat();cv.cvtColor(src, gray, cv.COLOR_RGBA2GRAY, 0);//它创建了一个矩形区域(ROI,Region of Interest)并从灰度图像中提取该区域let rect = new cv.Rect(x,y+imgYOffset,scaledWidth,scaledHeight);gray = gray.roi(rect);// 创建 MatVector 并添加灰度图像const matVector = new cv.MatVector();matVector.push_back(gray);// 计算直方图const histSize = [256]; // 直方图的大小const ranges = [0, 256]; // 像素值范围const hist = new cv.Mat(); // 直方图结果const channels = [0]; // 通道索引const mask = new cv.Mat(); // 掩码cv.calcHist(matVector, channels, mask, hist, histSize, ranges);// 找到直方图的波峰const histData = hist.data32F; // 获取直方图数据let maxVal = 0;let maxIdx = 0;for (let i = 0; i < histSize[0]; i++) {if (histData[i] > maxVal) {maxVal = histData[i];maxIdx = i;}}// 波峰 ±150 的范围const lowerBound = maxIdx - 25;const upperBound = maxIdx + 25;console.log("222")console.log(maxIdx);// 创建一个红色的图像const redImage = new cv.Mat(src.rows, src.cols, src.type(), [255, 0, 0, 255]);for (let i = y+imgYOffset; i < y+imgYOffset+scaledHeight; i++) {for (let j = x; j < x+scaledWidth; j++) {const pixel = src.ucharPtr(i, j)[1];if (pixel < lowerBound || pixel > upperBound) {// 将不在波峰 ±150 范围内的像素变为红色src.ucharPtr(i, j)[0] = 255; // Rsrc.ucharPtr(i, j)[1] = 0;   // Gsrc.ucharPtr(i, j)[2] = 0;   // B}}}// 显示结果cv.imshow(canvas[0], src);// 释放内存src.delete();gray.delete();matVector.delete();hist.delete();mask.delete();redImage.delete();// result.delete();// 绘制刻度线const scaleLineY = y+20; // 刻度线距离顶部的距离(原为20,增加5个单位)const scaleLineLength = scaledWidth; // 刻度线的长度const scaleLineX =x; // 刻度线的起始X坐标ctx.strokeStyle = '#fbf321'; // 刻度线颜色ctx.lineWidth = 2; // 刻度线宽度ctx.beginPath();ctx.moveTo(scaleLineX, scaleLineY);ctx.lineTo(scaleLineX + scaleLineLength, scaleLineY);ctx.stroke();// 绘制刻度标记(可选)const numTicks = 10; // 刻度标记的数量const tickLength = 5; // 刻度标记的长度const middleTickLength = 10; // 中间刻度标记的长度const tickSpacing = scaleLineLength / numTicks; // 刻度标记之间的间距for (let i = 0; i <= numTicks; i++) {const tickX = scaleLineX + i * tickSpacing;const isMiddleTick = i === numTicks / 2; // 判断是否为中间刻度const currentTickLength = isMiddleTick ? middleTickLength : tickLength; // 如果是中间刻度,使用更长的长度ctx.beginPath();ctx.moveTo(tickX, scaleLineY);ctx.lineTo(tickX, scaleLineY - currentTickLength); // 刻度线向上绘制ctx.stroke();// 在最左面标注“0”if (i === 0) {ctx.fillStyle = '#ffffff'; // 文本颜色ctx.font = '12px Arial'; // 字体大小和样式ctx.textAlign = 'left'; // 文本左对齐ctx.textBaseline = 'bottom'; // 文本底部对齐ctx.fillText('0', tickX, scaleLineY - currentTickLength - 1); // 在刻度线上方标注“0”}}// 标注图像长度ctx.fillStyle = '#ffffff'; // 文本颜色ctx.font = '12px Arial'; // 字体大小和样式ctx.textAlign = 'right'; // 文本右对齐ctx.textBaseline = 'middle'; // 文本垂直居中对齐// 在刻度线最右面标注图像长度const labelX = scaleLineX + scaleLineLength + 20; // 文本的X坐标(刻度线最右端 + 10个单位)const labelY = scaleLineY - 11; // 文本的Y坐标(在刻度线上方,原为15,增加5个单位)if (this.flagf == 1) {ctx.fillText(`${(imgWidth * 0.098).toFixed(2)}mm`, labelX, labelY);} else {ctx.fillText(`${(imgWidth * 0.103).toFixed(2)}mm`, labelX, labelY);}// 右侧刻度线的位置和长度const scaleLineXRight = scaleLineX + scaledWidth; // 右侧刻度线的X坐标(图片右侧偏移20像素)const scaleLineYRight = y+20; // 右侧刻度线的Y坐标(从顶部开始)var scaleLineLengthRight = 0;if (imgHeight - imgWidth > 30) {scaleLineLengthRight = scaledHeight; // 右侧刻度线的长度(与图片高度相同)} else {scaleLineLengthRight = scaledHeight; // 右侧刻度线的长度(与图片高度相同)}// 绘制右侧刻度线ctx.strokeStyle = '#fbf321'; // 刻度线颜色ctx.lineWidth = 2; // 刻度线宽度ctx.beginPath();ctx.moveTo(scaleLineXRight, scaleLineYRight);ctx.lineTo(scaleLineXRight, scaleLineYRight + scaleLineLengthRight);ctx.stroke();// 绘制右侧刻度标记(可选)const numTicksRight = 10; // 刻度标记的数量const tickLengthRight = 5; // 刻度标记的长度const middleTickLengthRight = 10; // 中间刻度标记的长度const tickSpacingRight = scaleLineLengthRight / numTicksRight; // 刻度标记之间的间距for (let i = 0; i <= numTicksRight; i++) {const tickY = scaleLineYRight + i * tickSpacingRight;const isMiddleTick = i === numTicksRight / 2; // 判断是否为中间刻度const currentTickLength = isMiddleTick ? middleTickLengthRight : tickLengthRight; // 如果是中间刻度,使用更长的长度ctx.beginPath();ctx.moveTo(scaleLineXRight, tickY);ctx.lineTo(scaleLineXRight + currentTickLength, tickY); // 刻度线向右绘制ctx.stroke();// 在最上面的刻度位置显示 "0"if (i === 0) {ctx.fillStyle = '#ffffff'; // 文本颜色ctx.font = '12px Arial'; // 字体大小和样式ctx.textAlign = 'left'; // 文本左对齐ctx.textBaseline = 'middle'; // 文本垂直居中对齐ctx.fillText('0', scaleLineXRight + currentTickLength + 5, tickY); // 在刻度线右侧绘制 "0"}}// 标注图像高度ctx.fillStyle = '#ffffff'; // 文本颜色ctx.font = '12px Arial'; // 字体大小和样式ctx.textAlign = 'center'; // 文本居中对齐ctx.textBaseline = 'middle'; // 文本垂直居中对齐// 在右侧刻度线最下面标注图像高度const labelXRight = scaleLineXRight + 30; // 文本的X坐标(刻度线右侧偏移15像素)const labelYRight = scaleLineYRight + scaleLineLengthRight - 10; // 文本的Y坐标(在刻度线最下面)if (this.flagf == 1) {ctx.fillText(`${(imgHeight * 0.098).toFixed(2)}mm`, labelXRight, labelYRight); // 绘制文本} else {ctx.fillText(`${(imgHeight * 0.103).toFixed(2)}mm`, labelXRight, labelYRight); // 绘制文本}});},processImage2(img) {this.$nextTick(() => {console.log("ppsasasa")const canvas = this.$refs.myCanvas;const ctx = canvas[0].getContext('2d');var canvasWidth = canvas[0].width;var canvasHeight = canvas[0].height;var imgWidth = img.width;var imgHeight = img.height;var imgYOffset = 20;// 计算宽高比和缩放比例var scaledWidth = 0;var scaledHeight = 0;if (imgWidth > imgHeight) {scaledWidth = 190;scaledHeight = Math.floor(scaledWidth * (imgHeight/imgWidth));} else {scaledHeight = 210;scaledWidth = Math.floor(scaledHeight * (imgWidth/imgHeight));}// 清除 Canvasctx.clearRect(0, 0, canvasWidth, canvasHeight);ctx.fillStyle = '#081c31';ctx.strokeStyle = '#081c31';ctx.fillRect(0, 0, canvasWidth, canvasHeight);var x = Math.floor((210 - scaledWidth) / 2);var y = Math.floor((210 - scaledHeight) / 2);ctx.drawImage(img, x, y+imgYOffset, scaledWidth, scaledHeight);// 读取图像const src = cv.imread(canvas[0]);// // 创建一个目标矩阵用于灰度图像// const gray = new cv.Mat();// cv.cvtColor(src, gray, cv.COLOR_RGBA2GRAY, 0);// // 创建一个二值化图像,将白色区域分离出来// const binary = new cv.Mat();// cv.threshold(gray, binary, 170, 255, cv.THRESH_BINARY);// // // 将二值化图像作为掩码,将红色图像应用到白色区域// const result = new cv.Mat();// // 将原始图像中非白色区域保留// cv.bitwise_not(binary, binary);// cv.bitwise_and(src, src, result, binary);// // 显示结果// cv.imshow(canvas[0], result);// // 释放内存// src.delete();// gray.delete();// binary.delete();// result.delete();// 绘制刻度线const scaleLineY = y+20; // 刻度线距离顶部的距离(原为20,增加5个单位)const scaleLineLength = scaledWidth; // 刻度线的长度const scaleLineX =x; // 刻度线的起始X坐标ctx.strokeStyle = '#fbf321'; // 刻度线颜色ctx.lineWidth = 2; // 刻度线宽度ctx.beginPath();ctx.moveTo(scaleLineX, scaleLineY);ctx.lineTo(scaleLineX + scaleLineLength, scaleLineY);ctx.stroke();// 绘制刻度标记(可选)const numTicks = 10; // 刻度标记的数量const tickLength = 5; // 刻度标记的长度const middleTickLength = 10; // 中间刻度标记的长度const tickSpacing = scaleLineLength / numTicks; // 刻度标记之间的间距for (let i = 0; i <= numTicks; i++) {const tickX = scaleLineX + i * tickSpacing;const isMiddleTick = i === numTicks / 2; // 判断是否为中间刻度const currentTickLength = isMiddleTick ? middleTickLength : tickLength; // 如果是中间刻度,使用更长的长度ctx.beginPath();ctx.moveTo(tickX, scaleLineY);ctx.lineTo(tickX, scaleLineY - currentTickLength); // 刻度线向上绘制ctx.stroke();// 在最左面标注“0”if (i === 0) {ctx.fillStyle = '#ffffff'; // 文本颜色ctx.font = '12px Arial'; // 字体大小和样式ctx.textAlign = 'left'; // 文本左对齐ctx.textBaseline = 'bottom'; // 文本底部对齐ctx.fillText('0', tickX, scaleLineY - currentTickLength - 1); // 在刻度线上方标注“0”}}// 标注图像长度ctx.fillStyle = '#ffffff'; // 文本颜色ctx.font = '12px Arial'; // 字体大小和样式ctx.textAlign = 'right'; // 文本右对齐ctx.textBaseline = 'middle'; // 文本垂直居中对齐// 在刻度线最右面标注图像长度const labelX = scaleLineX + scaleLineLength + 20; // 文本的X坐标(刻度线最右端 + 10个单位)const labelY = scaleLineY - 11; // 文本的Y坐标(在刻度线上方,原为15,增加5个单位)if (this.flagf == 1) {ctx.fillText(`${(imgWidth * 0.098).toFixed(2)}mm`, labelX, labelY);} else {ctx.fillText(`${(imgWidth * 0.103).toFixed(2)}mm`, labelX, labelY);}// 右侧刻度线的位置和长度const scaleLineXRight = scaleLineX + scaledWidth; // 右侧刻度线的X坐标(图片右侧偏移20像素)const scaleLineYRight = y+20; // 右侧刻度线的Y坐标(从顶部开始)var scaleLineLengthRight = 0;if (imgHeight - imgWidth > 30) {scaleLineLengthRight = scaledHeight; // 右侧刻度线的长度(与图片高度相同)} else {scaleLineLengthRight = scaledHeight; // 右侧刻度线的长度(与图片高度相同)}// 绘制右侧刻度线ctx.strokeStyle = '#fbf321'; // 刻度线颜色ctx.lineWidth = 2; // 刻度线宽度ctx.beginPath();ctx.moveTo(scaleLineXRight, scaleLineYRight);ctx.lineTo(scaleLineXRight, scaleLineYRight + scaleLineLengthRight);ctx.stroke();// 绘制右侧刻度标记(可选)const numTicksRight = 10; // 刻度标记的数量const tickLengthRight = 5; // 刻度标记的长度const middleTickLengthRight = 10; // 中间刻度标记的长度const tickSpacingRight = scaleLineLengthRight / numTicksRight; // 刻度标记之间的间距for (let i = 0; i <= numTicksRight; i++) {const tickY = scaleLineYRight + i * tickSpacingRight;const isMiddleTick = i === numTicksRight / 2; // 判断是否为中间刻度const currentTickLength = isMiddleTick ? middleTickLengthRight : tickLengthRight; // 如果是中间刻度,使用更长的长度ctx.beginPath();ctx.moveTo(scaleLineXRight, tickY);ctx.lineTo(scaleLineXRight + currentTickLength, tickY); // 刻度线向右绘制ctx.stroke();// 在最上面的刻度位置显示 "0"if (i === 0) {ctx.fillStyle = '#ffffff'; // 文本颜色ctx.font = '12px Arial'; // 字体大小和样式ctx.textAlign = 'left'; // 文本左对齐ctx.textBaseline = 'middle'; // 文本垂直居中对齐ctx.fillText('0', scaleLineXRight + currentTickLength + 5, tickY); // 在刻度线右侧绘制 "0"}}// 标注图像高度ctx.fillStyle = '#ffffff'; // 文本颜色ctx.font = '12px Arial'; // 字体大小和样式ctx.textAlign = 'center'; // 文本居中对齐ctx.textBaseline = 'middle'; // 文本垂直居中对齐// 在右侧刻度线最下面标注图像高度const labelXRight = scaleLineXRight + 30; // 文本的X坐标(刻度线右侧偏移15像素)const labelYRight = scaleLineYRight + scaleLineLengthRight - 10; // 文本的Y坐标(在刻度线最下面)if (this.flagf == 1) {ctx.fillText(`${(imgHeight * 0.098).toFixed(2)}mm`, labelXRight, labelYRight); // 绘制文本} else {ctx.fillText(`${(imgHeight * 0.103).toFixed(2)}mm`, labelXRight, labelYRight); // 绘制文本}});},

在这里插入图片描述
当然还有一些属性看官网了解下,只要什么时候用什么就可以

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/905633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Python代码绘制动态3D爱心效果

引言 介绍Python在创意编程中的应用&#xff0c;特别是如何通过简单的代码实现视觉上的美感。引出本文将分享的爱心代码&#xff0c;并简要说明其实现原理。 爱心代码的基本实现 展示一个简单的Python代码示例&#xff0c;使用字符画的方式在控制台中绘制一个爱心图案。 pr…

使用Python开发经典俄罗斯方块游戏

使用Python开发经典俄罗斯方块游戏 在这篇教程中&#xff0c;我们将学习如何使用Python和Pygame库开发一个经典的俄罗斯方块游戏。这个项目将帮助你理解游戏开发的基本概念&#xff0c;包括图形界面、用户输入处理、碰撞检测等重要内容。 项目概述 我们将实现以下功能&…

兼顾长、短视频任务的无人机具身理解!AirVista-II:面向动态场景语义理解的无人机具身智能体系统

作者&#xff1a;Fei Lin 1 ^{1} 1, Yonglin Tian 2 ^{2} 2, Tengchao Zhang 1 ^{1} 1, Jun Huang 1 ^{1} 1, Sangtian Guan 1 ^{1} 1, and Fei-Yue Wang 2 , 1 ^{2,1} 2,1单位&#xff1a; 1 ^{1} 1澳门科技大学创新工程学院工程科学系&#xff0c; 2 ^{2} 2中科院自动化研究所…

【蓝桥杯省赛真题49】python偶数 第十五届蓝桥杯青少组Python编程省赛真题解析

python偶数 第十五届蓝桥杯青少组python比赛省赛真题详细解析 博主推荐 所有考级比赛学习相关资料合集【推荐收藏】1、Python比赛 信息素养大赛Python编程挑战赛 蓝桥杯python选拔赛真题详解

鸿蒙(HarmonyOS)应用开发入门教程

目录 第一章:鸿蒙系统简介 1.1 什么是鸿蒙系统? 1.2 鸿蒙系统架构 第二章:开发环境搭建 2.1 安装DevEco Studio 步骤1:下载与安装 步骤2:首次配置 步骤3:设备准备 2.2 创建第一个项目 第三章:鸿蒙应用开发基础 3.1 核心概念:Ability与AbilitySlice 示例代码…

VM中 ubuntu 网卡不显示

1.添加网卡配置 #sudo nano /etc/netplan/01-netcfg.yaml network:version: 2renderer: networkdethernets:ens33:dhcp4: trueens37:dhcp4: trueens38:dhcp4: true#保存后 sudo netplan apply2.查看网络状态 sudo systemctl start systemd-networkd sudo systemctl status sy…

阿克曼-幻宇机器人系列教程3- 机器人交互实践(Message)

上一篇文章介绍了如何通过topic操作命令实现与机器人的交互&#xff0c;本篇我们介绍如何通过Message&#xff08;即topic的下一级&#xff09;实现与机器人的交互。 和topic一样&#xff0c;首先在一个终端通过ssh命令登录机器人、启动机器人&#xff0c;然后打开另外一个终端…

Python 调试扩展版本兼容问题解决纪实

在 Python 开发中&#xff0c;调试工具的正常使用对效率至关重要。近期在公司项目中&#xff0c;便遇到了 Python 调试扩展与版本不兼容的问题。公司 ERP 服务器采用 Ubuntu 18.04 系统&#xff0c;其标配 Python 版本为 3.6&#xff0c;而常用的 Python Debugger 扩展对版本有…

React 第四十二节 Router 中useLoaderData的用途详解

一、前言 useLoaderData&#xff0c;用于在组件中获取路由预加载的数据。它通常与路由配置中的 loader 函数配合使用&#xff0c;用于在页面渲染前异步获取数据&#xff08;如 API 请求&#xff09;&#xff0c;并将数据直接注入组件&#xff0c;从而简化数据流管理。 二、us…

Linux——mysql主从复制与读写分离

目录 一&#xff0c;理解什么是mysql主从复制 1&#xff0c;mysql支持的复制类型 2&#xff0c;mysql主从复制的工作流程 二&#xff0c;配置mysql主从复制 三&#xff0c;配置mysql主主复制 四&#xff0c;mysql读写分离 1&#xff0c;了解什么是mysql读写分离 2&…

MongoDB数据库深度解析:架构、特性与应用场景

在现代应用程序开发中&#xff0c;数据存储技术的选择至关重要。在众多的数据库管理系统中&#xff0c;MongoDB以其灵活性和强大的功能迅速崛起&#xff0c;成为NoSQL数据库中的佼佼者。本文将深入解析MongoDB的架构、核心特性、性能优化及其在实际应用中的最佳实践&#xff0c…

3D曲面上的TSP问题(一):曲面上点集距离求解

3D曲面上&#xff0c;两点的距离求解不能采用欧式距离&#xff0c;而需要计算测地线距离。 代码使用CGAL 5.6.2 OpenCV 4.11.0 版本实现 #include "cgal_utils.h" #include <CGAL/AABB_tree.h> #include <CGAL/AABB_traits.h> #include <CGAL/AABB_…

【歌曲结构】2:小节与歌曲结构信息整合

歌曲小节与结构信息整合 我将为您整合小节信息与歌曲结构,创建一个更加详细的JSON数据结构。 处理方法 将小节时间与歌曲结构段落进行匹配为每个小节添加所属段落信息为小节添加格式化的时间戳为小节添加对应时间范围内的歌词{"song_title": "财神庙前许三亿…

C语言:深入理解指针(3)

目录 一、数组名的理解 二、用指针访问数组 三、一维数组传参的本质 四、冒泡排序 五、二级指针 六、指针数组 七、指针数组模拟二维数组 八、结语 一、数组名的理解 数组名其实就是首元素的地址 int arr[3] {1,2,3}; printf("arr :%p\n" ,arr); printf(…

Spring MVC 接口的访问方法如何设置

RequestMapping 是 Spring 框架中用于映射 HTTP 请求到控制器方法的注解。它支持以下 HTTP 方法访问类型&#xff0c;通过 method 属性指定&#xff1a; GET&#xff1a;用于获取资源POST&#xff1a;用于提交数据PUT&#xff1a;用于更新资源DELETE&#xff1a;用于删除资源PA…

linux libdbus使用案例

以下是一个基于 Linux libdbus 的详细指南,包含服务端和客户端的完整代码示例,涵盖 方法调用、信号发送 和 异步消息处理。libdbus 是 D-Bus 的底层 C 库,直接操作 D-Bus 协议,适合需要精细控制的场景。 1. libdbus 的核心机制 连接管理:通过 dbus_bus_get 连接系统总线或…

Day118 | 灵神 | 二叉树 | 删点成林

Day118 | 灵神 | 二叉树 | 删点成林 1110.删点成林 1110. 删点成林 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 最直接的思路就是看当前结点的值是不是在要删除的列表中&#xff0c;在的话删除当前结点并把左右孩子加入res中 很可惜这样是错的&#xff0c;…

趣味编程:钟表

目录 1. 效果展示 2. 源码展示 3. 逻辑概述 3.1 表针绘制函数&#xff08;DrawHand&#xff09; 3.2 表盘绘制函数 3.3 主程序逻辑 4. 小结 概述&#xff1a;本篇博客主要介绍简易钟表的绘制。 1. 效果展示 该钟表会随着系统的时间变化而变化&#xff0c;动态的效…

ansible进阶02

管理主机清单变量 使用变量的原则 变量创建的位置 角色的defaults或vars目录主机清单playbook或主机清单所在位置的子目录group_vars和host_varsplay或角色或任务 无论在哪创建变量&#xff0c;都应该遵守一些规则&#xff1a; 保持简洁不要重复造轮子。不要反复在多个位置…

C40-指针

一 指针的引入 什么是指针:指针是一个变量&#xff0c;其值是另一个变量的内存地址 简单的使用地址输出一个变量: 代码示例 #include <stdio.h> int main() {int a10;printf("a的地址是:%p\n",&a);printf("a%d\n",*(&a)); //*号是取值运算符…