Qt 三维柱状图 Q3DBar 和 三维条形图中的数据序列 QBar3DSeries

(一) 使用 Q3DBars 图形类和 QBar3DSeries 序列类可以绘制三维柱状图

窗口右侧是用 Q3DBars 和 QBar3DSeries 绘制的三维柱状图,这个图只有一个QBar3DSeries序列,数据是按行存储的,可以有多行。水平方向是行坐标轴和列坐标轴,使用OCategory3DAxis 坐标轴类;垂直方向是数值坐标轴,使用 QValue3DAxis 坐标轴类。在图上点击一个棒柱时,可以在图上显示其行标签、列标签和数值,状态栏上还会显示其行编号、列编号和数值。无须额外编程或设置,在图上按住鼠标右键并上下左右拖动鼠标可以进行水平和垂直方向的旋转,滚动鼠标滚轮可以进行缩放。 窗口工具栏上的按钮用于修改棒柱的基本颜色,修改选中棒柱的数值,添加、插入或删除行等。 窗口左侧是操作面板,分为多个分组框。

  • “旋转和平移”分组框。可以选择预设的三维图观察视角,可以通过 QSlider 组件进行水平旋转、垂直旋转和缩放。
  • 分组框里的4个方向按钮用于使三维柱状图在4个方向上平移,中间的按钮用于复位视角。
  • “图形总体”分组框。用于设置三维图形的主题、标签字体大小、棒柱选择模式,以及设置三维图形的各种元素的可见性和显示效果等。
  • “序列设置”分组框。设置序列的一些属性,如棒柱的样式、光滑效果等。

效果图:
在这里插入图片描述

(二) 3D部件创建及添加到窗口

1 添加三维图Q3DBars 三维图的容器QWidget和三维条形图中的数据序列QBar3DSeries

private:QWidget* graphContainer;        //三维图的容器Q3DBars* graph3D;               //三维图QBar3DSeries* series;           //三维条形图中的数据序列

2 初始化 3D部件并添加到窗口

void mainwindow::iniGraph3D()
{graph3D = new Q3DBars();            //创建三维图graphContainer = QWidget::createWindowContainer(graph3D, this);//Q3DBars继承自QWindowgraph3D->scene()->activeCamera()    //设置视角->setCameraPreset(Q3DCamera::CameraPresetFrontHigh); //设置 Z坐标轴QValue3DAxis* axisV = new QValue3DAxis; //数值坐标axisV->setTitle(QString::fromLocal8Bit("销量"));axisV->setTitleVisible(true);axisV->setLabelFormat("%d");graph3D->setValueAxis(axisV);  			 //设置数值坐标轴//设置 X坐标轴QCategory3DAxis* axisRow = new QCategory3DAxis;axisRow->setTitle("row axis");axisRow->setTitleVisible(true);graph3D->setRowAxis(axisRow);  			 //设置行坐标轴//设置 Y坐标轴QCategory3DAxis* axisCol = new QCategory3DAxis;axisCol->setTitle("column axis");axisCol->setTitleVisible(true);graph3D->setColumnAxis(axisCol);		//设置列坐标轴//创建序列series = new QBar3DSeries;series->setMesh(QAbstract3DSeries::MeshCylinder);       //棒柱形状series->setItemLabelFormat("(@rowLabel,@colLabel): %d");//项的标签显示格式graph3D->addSeries(series);//设置数据代理的数据QBarDataArray* dataArray = new QBarDataArray; //棒柱数据数组,typedef QList<QBarDataRow *> QBarDataArray;for (int i = 0; i <3; i++)   			  //行{QBarDataRow* dataRow = new QBarDataRow;   //棒柱数据行,typedef QList<QBarDataItem> QBarDataRow;for (int j = 1; j <= 5; j++)          //列{quint32 value = rand()%15+1;          //随机整数[1,15]QBarDataItem* dataItem = new QBarDataItem;//创建棒柱数据对象dataItem->setValue(value);            //设置棒柱的数据dataRow->append(*dataItem);           //添加到棒柱数据行}dataArray->append(dataRow);               //棒柱数据数组添加一个棒柱数据行}QStringList rowLabs;    //行坐标标签rowLabs << "Week1" << "Week2" << "Week3";series->dataProxy()->setRowLabels(rowLabs); //设置数据代理的行标签QStringList colLabs;    //列坐标标签colLabs << "Mon" << "Tue" << "Wed" << "Thur" << "Fri";series->dataProxy()->setColumnLabels(colLabs);//设置数据代理的列标签series->dataProxy()->resetArray(dataArray);   //重设数据代理的数据connect(series, &QBar3DSeries::selectedBarChanged,this, &mainwindow::do_barSelected);
}

2-1 设置项标签格式

如果没有为该系列显式设置数据代理,则该系列将创建默认代理。设置另一个代理将销毁现有代理以及添加到其中的所有数据。

标签格式注释
@rowTitle来自行轴的标题
@colTitle列轴的标题
@valueTitle来自值轴的标题
@rowIdx可见行索引,使用图形区域设置进行了本地化
@colIdx可见列索引,使用图形区域设置进行了本地化
@rowLabel来自行轴的标签
@colLabel来自列轴的标签
@valueLabel使用附加到图形的值轴格式格式化的项值
@seriesName系列的名称
%<format spec>指定格式的项值。使用与QValue3DAxis::abelFormat相同的规则进行格式化

3 选中棒柱

void mainwindow::do_barSelected(const QPoint& position)
{if (position.x() < 0 || position.y() < 0)  //必须加此判断{ui->actBar_ChangeValue->setEnabled(false);return;}ui->actBar_ChangeValue->setEnabled(true);const QBarDataItem* bar = series->dataProxy()->itemAt(position);QString info = QString::fromLocal8Bit("选中的棒柱,Row=%1, Column=%2, Value=%3").arg(position.x()).arg(position.y()).arg(bar->value());ui->statusBar->showMessage(info);
}

(三) 3D部件创建及添加到窗口

1 序列颜色 - 设置序列基本颜色

void mainwindow::on_actSeries_BaseColor_triggered()
{//设置序列基本颜色QColor  color = series->baseColor();color = QColorDialog::getColor(color);if (color.isValid()){series->setBaseColor(color);}        
}

2 重新生成 - 重新生成数据画图

void mainwindow::on_actRedraw_triggered()
{QBarDataProxy* dataProxy = new QBarDataProxy;    //新建数据代理int rowCount = series->dataProxy()->rowCount();  //数据代理的行数for (int i = 0; i < rowCount; i++)  //行{QBarDataRow* dataRow = new QBarDataRow;       //棒柱数据行for (int j = 1; j <= 5; j++)     //列{quint32 value = rand() % (15 - 5 + 1) + 5;QBarDataItem* dataItem = new QBarDataItem;   //数据项dataItem->setValue(value);dataRow->append(*dataItem);}QString rowStr = QString::fromLocal8Bit("第%1周").arg(i + 1);dataProxy->addRow(dataRow, rowStr);     //添加行数据和标签}QStringList colLabs = series->dataProxy()->columnLabels();    //原来的列坐标轴标签dataProxy->setColumnLabels(colLabs);series->dataProxy()->resetArray();  //清除数据代理和坐标轴标签,必须清除,否则不能重新设置坐标轴标签series->setDataProxy(dataProxy);    //重新设置数据代理,会删除之前的数据代理
}

3 修改数值 - 修改选中棒柱的数值(F2)

void mainwindow::on_actBar_ChangeValue_triggered()
{QPoint position = series->selectedBar();if (position.x() < 0 || position.y() < 0)   //必须加此判断return;QBarDataItem bar = *(series->dataProxy()->itemAt(position));qreal value = bar.value();    //原来的值bool ok;value = QInputDialog::getInt(this, QString::fromLocal8Bit("输入数值"),QString::fromLocal8Bit("更改棒柱数值"), value, 0, 50, 1, &ok);if (ok){bar.setValue(value);series->dataProxy()->setItem(position, bar);}
}

4 添加行 - 添加一行

void mainwindow::on_actData_Add_triggered()
{//添加行const QString rowLabel = QInputDialog::getText(this,QString::fromLocal8Bit("输入字符串"),QString::fromLocal8Bit("请输入行标签"));if (rowLabel.isEmpty())return;QBarDataRow* dataRow = new QBarDataRow;       //棒柱数据行for (int j = 1; j <= 5; j++)     //固定5列{quint32 value = rand()%(25 - 15 + 1) + 15;QBarDataItem* dataItem = new QBarDataItem;dataItem->setValue(value);dataRow->append(*dataItem);}series->dataProxy()->addRow(dataRow, rowLabel);     //添加棒柱数据行和标签}

5 插入行 - 插入一行

void mainwindow::on_actData_Insert_triggered()
{//插入行QString rowLabel = QInputDialog::getText(this, QString::fromLocal8Bit("输入字符串"), QString::fromLocal8Bit("请输入行标签"));if (rowLabel.isEmpty())return;QPoint position = series->selectedBar();int index = position.x(); //当前行号if (index < 0)index = 0;QBarDataRow* dataRow = new QBarDataRow;       //棒柱数据行for (int j = 1; j <= 5; j++)     //固定5列{quint32 value = rand() % (30 - 20) + 20; QBarDataItem* dataItem = new QBarDataItem;dataItem->setValue(value);dataRow->append(*dataItem);}series->dataProxy()->insertRow(index, dataRow);    //插入棒柱数据行}

6 删除行 - 删除当前行

void mainwindow::on_actData_Delete_triggered()
{QPoint position = series->selectedBar();if (position.x() < 0 || position.y() < 0)return;int rowIndex = position.x();  //当前行号int removeCount = 1;          //删除的行数int removeLabels = true;      //是否删除行标签series->dataProxy()->removeRows(rowIndex, removeCount, removeLabels);
}

7 退出 - 退出本程序

void mainwindow::on_actQiut_triggered()
{QApplication::quit();
}

(四) “旋转和平移”分组框功能

1 预设视角

void mainwindow::on_comboCamera_currentIndexChanged(int index)
{Q3DCamera::CameraPreset  cameraPos =  Q3DCamera::CameraPreset(index);graph3D->scene()->activeCamera()->setCameraPreset(cameraPos);
}

预设视角类型参考 enum Q3DCamera::CameraPreset

2 水平旋转

void mainwindow::on_sliderH_valueChanged(int value)
{graph3D->scene()->activeCamera()->setXRotation(value);
}

3 垂直旋转

void mainwindow::on_sliderV_valueChanged(int value)
{graph3D->scene()->activeCamera()->setYRotation(value);
}

4 缩放

void mainwindow::on_sliderZoom_valueChanged(int value)
{graph3D->scene()->activeCamera()->setZoomLevel(value);
}

5 下移

void mainwindow::on_btnMoveDown_clicked()
{QVector3D target3D = graph3D->scene()->activeCamera()->target();qreal z = target3D.z();target3D.setZ(z + 0.1);graph3D->scene()->activeCamera()->setTarget(target3D);
}

6 上移

void mainwindow::on_btnMoveUp_clicked()
{QVector3D target3D = graph3D->scene()->activeCamera()->target();qreal z = target3D.z();target3D.setZ(z - 0.1);graph3D->scene()->activeCamera()->setTarget(target3D);
}

7 左移

void mainwindow::on_btnMoveLeft_clicked()
{QVector3D target3D = graph3D->scene()->activeCamera()->target();qreal x = target3D.x();target3D.setX(x + 0.1);graph3D->scene()->activeCamera()->setTarget(target3D);
}

8 右移

void mainwindow::on_btnMoveRight_clicked()
{QVector3D target3D = graph3D->scene()->activeCamera()->target();qreal x = target3D.x();target3D.setX(x - 0.1);graph3D->scene()->activeCamera()->setTarget(target3D);
}

9 复位(到 FrontHigh 视角)

void mainwindow::on_btnResetCamera_clicked()
{graph3D->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFrontHigh);

(五) “图形总体”分组框功能

1 显示选中棒柱的标签 CheckBox

void mainwindow::on_cBoxTheme_currentIndexChanged(int index)
{Q3DTheme* currentTheme = graph3D->activeTheme();currentTheme->setType(Q3DTheme::Theme(index));
}

2 轴标签字体大小

void mainwindow::on_spinFontSize_valueChanged(int arg1)
{QFont font = graph3D->activeTheme()->font();font.setPointSize(arg1);graph3D->activeTheme()->setFont(font);   
}

3 选择模式

void mainwindow::on_cBoxSelectionMode_currentIndexChanged(int index)
{graph3D->setSelectionMode(QAbstract3DGraph::SelectionFlags(index));
}

4 显示背景 CheckBox

void mainwindow::on_chkBoxBackground_clicked(bool checked)
{graph3D->activeTheme()->setBackgroundEnabled(checked);
}

4-1 选择模式

enum QAbstract3DGraph::SelectionFlag

枚举值含义
QAbstract3DGraph::SelectionNone不允许选择
QAbstract3DGraph::SelectionItem选择并且高亮显示一个项
QAbstract3DGraph::SelectionRow选择并且高亮显示一行
QAbstract3DGraph::SelectionItemAndRow选择一个项和一行,用不同颜色高亮显示
QAbstract3DGraph::SelectionColumn选择并且高亮显示一列
QAbstract3DGraph::SelectionItemAndColumn选择一个项和一列,用不同颜色高亮显示
QAbstract3DGraph::SelectionRowAndColumn选择交叉的一行和一列
QAbstract3DGraph::SelectionItemRowAndColumn选择交叉的一行和一列,用不同颜色高亮显示
QAbstract3DGraph::SelectionSlice切片选择,需要与 SelectionRow 或 SelectionColumn 结合使用
QAbstract3DGraph::SelectionMultiSeries选中同一个位置处的多个序列的项

5 显示背景网格 CheckBox

void mainwindow::on_chkBoxGrid_clicked(bool checked)
{graph3D->activeTheme()->setGridEnabled(checked);
}

6 显示倒影 CheckBox

void mainwindow::on_chkBoxReflection_clicked(bool checked)
{graph3D->setReflection(checked);
}

7 数值坐标轴反向 CheckBox

void mainwindow::on_chkBoxReverse_clicked(bool checked)
{graph3D->valueAxis()->setReversed(checked);
}

8 显示轴标题 CheckBox

void mainwindow::on_chkBoxAxisTitle_clicked(bool checked)
{graph3D->valueAxis()->setTitleVisible(checked);graph3D->rowAxis()->setTitleVisible(checked);graph3D->columnAxis()->setTitleVisible(checked);
}

9 显示轴标签背景 CheckBox

void mainwindow::on_chkBoxAxisBackground_clicked(bool checked)
{graph3D->activeTheme()->setLabelBackgroundEnabled(checked);
}

(六) “序列设置”分组框功能

1 棒柱样式 ComboBox

void mainwindow::on_cBoxBarStyle_currentIndexChanged(int index)
{QAbstract3DSeries::Mesh aMesh;aMesh = QAbstract3DSeries::Mesh(index + 1);  //0=MeshUserDefinedseries->setMesh(aMesh);
}

1-1 棒柱形状

enum QAbstract3DSeries::Mesh
并非所有样式都可用于所有可视化类型。

常量注释
QAbstract3DSeries::MeshUserDefined0用户定义网格,通过QAbstract3DSeries::userDefinedMesh属性设置
QAbstract3DSeries::MeshBar1基本矩形条
QAbstract3DSeries::MeshCube2基本多维数据集
QAbstract3DSeries::MeshPyramid3四边形金字塔
QAbstract3DSeries::MeshCone4基本圆锥体
QAbstract3DSeries::MeshCylinder5基本气缸
QAbstract3DSeries::MeshBevelBar6略微倾斜(圆形)的矩形钢筋
QAbstract3DSeries::MeshBevelCube7略微倾斜(圆形)的立方体
QAbstract3DSeries::MeshSphere8球体
QAbstract3DSeries::MeshMinimal9最小的三维网格:一个三角锥
QAbstract3DSeries::MeshArrow10向上的箭头
QAbstract3DSeries::MeshPoint112D点

2 光滑效果 CheckBox

void mainwindow::on_chkBoxSmooth_clicked(bool checked)
{series->setMeshSmooth(checked);
}

3 显示选中棒柱的标签 CheckBox

void mainwindow::on_chkBoxItemLabel_clicked(bool checked)
{series->setItemLabelFormat("value at (@rowLabel,@colLabel): %.1f");series->setItemLabelVisible(checked);
}

(七) 有关QBarDataProxy数据管理接口

函数功能
int addRow()添加一行数据,一行数据是 QBarDataRow 类型对象
void insertRow()在某行之前插入一行数据
void removeRows()从某行开始,移除指定行数的数据
void setRow ()为某一行重新设置一行数据
QBarDataRow *rowAt()返回某一行的数据
void setItem()根据行号和列号,设置某个棒柱数据项
QBarDataltem *itemAt()根据行号和列号,返回单个棒柱数据项
void resetArray()若不带任何参数,就清除数据代理所有的数据和标签;若使用一个 QBarDataArray类型的对象作为输入参数,就重新设置棒柱数据数组
int rowCount()返回数据代理的行数
void setRowLabels()用一个字符串列表设置行坐标轴的标签
StringList rowLabels()返回行坐标轴的所有标签
void setColumnLabels()用一个字符串列表设置列坐标轴的标签
QStringList columnLabels()返回列坐标轴的所有标签

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

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

相关文章

Windows安装和使用kafka

一、安装kafka 由于kafka依赖jdk和zookeeper&#xff0c;安装kafka之前需要先安装jdk和zookeeper&#xff0c;也可以使用kafka自带的zookeeper。安装jdk可以参考&#xff1a;Windows和Linux安装jdk&#xff0c;此处使用kafka自带的zookeeper&#xff0c;不单独安装。 下面在Wi…

VUE2/3:element ui table表格的显隐列(若依框架)

若依框架自带一个组件&#xff0c;封装了关于表格&#xff0c;展示和隐藏表格列的功能&#xff1b; 使用效果就是这样的&#xff0c;在表格上面&#xff0c;三个框&#xff0c;从左到右分别是隐藏上面搜索&#xff0c;刷新列表&#xff0c;和显隐列的功能&#xff1b; 一、下面…

每日一题 82. 删除排序链表中的重复元素 II(中等,链表)

和昨天差不多&#xff0c;今天的是把所有重复数字的节点都删除&#xff08;昨天留了一个&#xff09; 显然当我们发现重复数字时&#xff0c;需要重复的第一个数字的前一个节点才能把重复数字删完&#xff0c;所有在while循环中我们每次判断 t.next 和 t.next.next 的值是否重复…

互联网今年都崩盘了gis开发还有前途嘛?

互联网和GIS其实分不开的&#xff0c;尤其是在新兴技术领域。 互联网行业都已经在进军测绘、GIS以及智慧城市、无人驾驶等行业&#xff0c;随着高新技术的发展&#xff0c;互联网和GIS其实结合会越来越紧密。 传统互联网行业已经不能满足大众需求&#xff0c;近十年&#xff…

如何应对Android面试官->我用RecyclerView实现了吸顶效果

前言 RecyclerView 计划用两个章节来讲解&#xff0c;今天主要是以 itemDecoration 和 实现吸顶效果为主&#xff1b; ItemDecoration ItemDecoration 允许应用给具体的 View 添加具体的图画或者 Layout 的偏移&#xff0c;对于绘制 View 之间的分割线&#xff0c;视觉分组边…

用bat脚本执行py文件以及批量执行py文件(全网超详细)

1.前言 对于python代码&#xff0c;每次执行一个文件就要运行一个命令&#xff0c;太过麻烦 在Windows电脑上&#xff0c;想一次性执行多个python文件的代码&#xff0c;就需要用到bat脚本 2.python代码 先写几个python代码的文件 如下图 3.py文件为中文&#xff0c;用bat执…

如何使用CFImagehost结合内网穿透搭建私人图床并无公网ip远程访问

[TOC] 推荐一个人工智能学习网站点击跳转 1.前言 图片服务器也称作图床&#xff0c;可以说是互联网存储中最重要的应用之一&#xff0c;不仅网站需要图床提供的外链调取图片&#xff0c;个人或企业也用图床存储各种图片&#xff0c;方便随时访问查看。不过由于图床很不挣钱&a…

腾讯云价格计算器怎么用?太简单了一键报价

腾讯云服务器价格计算器可以一键计算出云服务器的精准报价&#xff0c;包括CVM实例规格价格、CPU内存费用、公网带宽收费、存储系统盘和数据盘详细费用&#xff0c;腾讯云百科txybk.com分享腾讯云价格计算器链接入口、使用方法说明&#xff1a; 腾讯云服务器价格计算器 打开腾…

❤ React报错问题分析

❤ React报错问题分析 ❤️ You passed a second argument to root.render(…) but it only accepts one argument. You passed a second argument to root.render(…) but it only accepts one argument. react-dom.development.js:86 Warning: You passed a second argumen…

css 居中方式

居中分为水平居中和垂直居中

C++ 数组分页,经常有用到分页,索性做一个简单封装 已解决

在项目设计中&#xff0c; 有鼠标滑动需求&#xff0c;但是只能说能力有限&#xff0c;索性使用 php版本的数组分页&#xff0c;解决问题。 经常有用到分页&#xff0c;索性做一个简单封装、 测试用例 QTime curtime QTime::currentTime();nHour curtime.hour();nMin curtim…

各种排序算法学习笔记

Docshttps://r0dhfl3ujy9.feishu.cn/docx/XFlEdnqv9oCEoVx7ok8cpc4knnf?fromfrom_copylink如果你认为有错误&#xff0c;欢迎指出&#xff01;

Three.js 镜面反射Reflector 为MeshStandardMaterial增加Reflector能力

效果效果官方案例 区别&#xff1a;官方的案例更像一个镜子 没有纹理等属性 也没有透明度修改 根据源码进行修改为 MeshStandardMaterial实现反射 使用案例 createReflector() {const plane this.helper.create.plane(2, 2);this.helper.add(plane.mesh);plane.mesh.rotat…

juniper EX系列交换机POE配置

PoE&#xff08;Power over Ethernet&#xff0c;以太网供电&#xff0c;又称远程供电&#xff09;是指设备通过以太网接口&#xff0c;利用双绞线对外接PD&#xff08;Powered Device&#xff0c;受电设备&#xff09;设备&#xff08;如IP 电话、无线AP、网络摄像头等&#x…

什么是视频短信,能用在什么地方?

视频短信是指通过106短信将带有视频的短信内容发送到对应的手机中&#xff0c;也称之为点对点的信息传递方式&#xff0c;视频短信可以支持2兆以内的多媒体信息发送&#xff0c;是直接、直观的宣传、沟通方式。 一、怎么就偏偏要找视频短信 根据目前的行情状况&#xff0c;尽管…

3d模型素材亮度和对比度如何调整呢?

1、修改材质参数&#xff1a;打开3ds Max后&#xff0c;选择要调整亮度和对比度的3D模型素材。然后&#xff0c;进入材质编辑器&#xff0c;选择相应的材质球。在材质编辑器中&#xff0c;你可以调整材质的漫反射、反射和高光等参数&#xff0c;这些参数将影响模型的亮度和对比…

C语言实现学生成绩管理系统(单链表)

本次我就用学到的相关链表知识总结回顾一下学生成绩管理系统的实现。 首先还是先创建一个项目&#xff0c;分别创建头文件和源文件&#xff0c;头文件用来声明函数&#xff0c;源文件用来定义函数以及实现学生成绩管理系统。 创建完成后如上图。 先创建一个结构体用来存放学生…

DaisyDisk for mac 中文激活版 可视化磁盘清理工具

DaisyDisk 是一款专为 Mac 设计的磁盘空间分析工具。它以直观、图形化的方式展示硬盘使用情况&#xff0c;帮助用户迅速找到占用空间大的文件和文件夹。通过扫描磁盘&#xff0c;DaisyDisk 生成彩色的扇形图表&#xff0c;每个扇区代表一个文件或文件夹&#xff0c;大小直观反映…

Java多线程并发篇----第十五篇

系列文章目录 文章目录 系列文章目录前言一、偏向锁二、分段锁三、锁优化四、线程基本方法前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、偏向锁 Hotspot 的…

肯尼斯·里科《C和指针》第6章 指针(4)实例

肯尼斯里科《C和指针》第6章 指针&#xff08;1&#xff09;-CSDN博客 肯尼斯里科《C和指针》第6章 指针&#xff08;2&#xff09;-CSDN博客 肯尼斯里科《C和指针》第6章 指针&#xff08;3&#xff09;-CSDN博客 6.12 实例 /* ** 计算一个字符串的长度。 */ #include <…