指针在C++中的应用及顺序表结构体中的应用

news2024/11/25 12:50:59

目录

一.指针的概要

指针

一级指针

二级指针

二、一个生动形象的例子

三、总结

四、顺序表结构体中的应用


一.指针的概要

  • 指针

是一种数据类型,它保存着一个变量的内存地址。指针可以通过间接引用操作符 * 来访问所指向的变量。在 C++ 中,指针通常用于动态分配内存、传递参数等场景。

  • 一级指针

是直接指向一个变量的指针。一级指针只包含一个地址值,它通常用于传递参数并允许函数修改那些参数的值。使用一级指针时需要注意,指针变量必须在声明后设置为指向有效的内存位置,否则可能会导致程序崩溃或产生未定义的行为。

以下是一级指针的示例:

int a = 5;
int* p = &a; // 定义一个整型指针变量 p,它指向 a 的地址
*p = 3;      // 通过指针 p 修改 a 的值
  • 二级指针

二级指针是指向指针的指针,也叫做间接指针。二级指针包含两个地址值,它通常用于多级数据结构中,例如图的邻接表实现,以及某些数据结构算法等场景。

以下是二级指针的示例:

int a = 5;
int* p = &a;
int** pp = &p; // 定义一个整型指针的指针变量 pp,它指向 p 的地址
**pp = 3;      // 通过指针 pp 修改 a 的值

需要注意的是,使用二级指针来访问变量时,需要使用两个 * 运算符。这是因为第一个 * 运算符表示取出指针变量中存储的地址,而第二个 * 运算符则对这个地址进行间接引用,获得指向的变量的值。

二、一个生动形象的例子

这是一个 C++ 的程序,其功能为计算某个班级同学的平均分。程序中定义了两个函数 calcAvgclassAvg,以及一个 main 函数。

calcAvg 函数的作用是计算某个学生的平均分,并返回平均分值。该函数接受两个参数,第一个参数 scores 是一个指向整型数组的指针,表示这个学生的五个成绩;第二个参数 size 是一个整数,表示成绩数组的长度(即本例中固定为5)。在函数内部,使用了指针算术运算 *(scores+i) 访问成绩数组中的元素,从而计算出总分,最终返回总分除以科目数得到的平均分。

classAvg 函数的作用是计算整个班级的平均分,并通过指针返回结果。该函数接受四个参数,第一个参数 students 是一个指向字符串数组的指针,表示班级中每个学生的名字;第二个参数 scores 是一个指向整型指针数组的指针,表示班 [好像出错了,请稍后再试。]

// 计算某个学生的平均分
double calcAvg(int* scores, int size) {
double sum = 0;
for (int i = 0; i < size; i++) {
sum += *(scores + i); // 使用指针算术运算访问成绩数组的元素,计算总分
}
return sum / size; // 返回总分除以科目数得到平均分
}

// 计算整个班级的平均分
void classAvg(string* students, int** scores, int size, double* result) {
double sum = 0;
for (int i = 0; i < size; i++) {
sum += calcAvg(*(scores + i), 5); // 调用 calcAvg 函数计算每个学生的平均分,并累加到总分之中
}
*result = sum / size; // 将计算后的平均分通过指针返回
}

int main() {
// 定义学生姓名和成绩数组
string students[] = {"Alice", "Bob", "Cathy", "David", "Eva"};
int scores[][5] = {{98, 87, 93, 89, 91},
{85, 81, 76, 92, 88},
{90, 87, 82, 89, 91},
{83, 79, 77, 86, 80},
{91, 89, 94, 95, 92}};
// 定义一个指针数组,保存每个学生的成绩数组指针
int* ptrScores[] = {scores[0], scores[1], scores[2], scores[3], scores[4]};
double result; // 保存班级平均分的变量
// 调用 classAvg 函数计算班级平均分,并将结果通过指针传递回来
classAvg(students, ptrScores, 5, &result);
cout << "Class average: " << result << endl; // 输出班级平均分
return 0;
}

在上述示例中,

我们定义了一个 calcAvg 函数来计算一个学生的平均分,它接收一个指向整型数组的指针以及数组长度作为参数

接下来,我们定义了 classAvg 函数来计算班级平均分,并通过指针返回结果。

classAvg 函数中,我们使用了一个二级指针 scores 来存储每个学生的成绩(即一级指针数组),并将其传递给 calcAvg 函数进行计算。最后,我们在 main 函数中调用 classAvg 函数,并通过指针返回结果。

这个例子中的二级指针 scores 通过间接引用可以获得每个学生的成绩,从而计算班级平均分。

三、总结

指针可以通过间接引用操作符 * 来访问所指向的变量。在 C++ 中,指针通常用于动态分配内存、传递参数等场景。

指针是一种数据类型,它保存着一个变量的内存地址。

一级指针是直接指向一个变量的指针,它只包含一个地址值。

二级指针是指向指针的指针,也叫做间接指针,它包含两个地址值。

一个生动的例子是,假设我们想要计算班级平均分,我们可以使用二级指针来存储每个学生的成绩,并通过间接引用获得每个学生的成绩,从而计算班级平均分。这个例子中的二级指针通过间接引用可以获得每个学生的成绩,从而计算班级平均分。

四、顺序表结构体中的应用

typedef struct ListNode
{
	int val;
	struct ListNode* next;
}LTNode,*PLTNode;

很多时候我们在数据结构当中看到是这个代码

这段代码定义了一个名为 ListNode 的结构体,包含 valnext 两个成员变量。其中,val 表示节点存储的值,next 表示指向下一个节点的指针。

另外,通过 typedef 关键字,还定义了两个新类型:LTNodePLTNode。其中,LTNodestruct ListNode 的别名,PLTNode 则是指向 struct ListNode 的指针类型。

这样定义的好处是可以简化复杂的类型声明,使得代码更加简洁易懂。在实际应用中,我们可以使用 PLTNode 来表示指向节点的指针,从而方便地进行链表操作。例如:

PLTNode head = NULL; // 链表头结点
head = (PLTNode)malloc(sizeof(LTNode)); // 动态分配内存
head->val = 1; // 节点值为 1
head->next = NULL; // 指向下一个节点的指针为 NULL

PLTNode p = (PLTNode)malloc(sizeof(LTNode));
p->val = 2; // 节点值为 2
p->next = NULL;
head->next = p; // 将新节点插入到链表中

 

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

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

相关文章

【AI绘画】探索艺术与技术的融合:AI绘画的新前景

AI绘画的新前景1.AI绘画是把双刃剑2.AI绘画的应用场景3.AI绘画的技术4.结语随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;AI绘画成为了艺术创作领域中备受关注的话题。传统的艺术创作方式受到了AI技术的冲击&#xff0c;为艺术家和观众带来了全新的体验和…

socket 通信(一)

一 基本示例 #include <stdio.h> #include <sys/socket.h> // socket() #include <arpa/inet.h> // inet_addr() #include <netinet/in.h> // sockaddr_in{} INADDR_ANY #include <unistd.h> // close() #include <errno.h> …

php7类型约束,严格模式

在PHP7之前&#xff0c;函数和类方法不需要声明变量类型 &#xff0c;任何数据都可以被传递和返回&#xff0c;导致几乎大部分的调用操作都要判断返回的数据类型是否合格。 为了解决这个问题&#xff0c;PHP7引入了类型声明。 目前有两类变量可以声明类型&#xff1a; 形参&a…

2023年贵州建筑八大员考试时间报名时间是什么时间呢?甘建二

2023年贵州建筑八大员考试时间报名时间是什么时候开始呢&#xff1f;贵州建筑八大员考试时间是什么时候呢&#xff1f;什么时候考试呢&#xff1f; 建筑八大员主要是用于企业资质、招投标、检查使用&#xff0c;目前很多企业急需这个证书&#xff0c;关于建筑八大员报名时间和考…

网络拥塞控制,对越远的流量越宽容

考虑下面的网络传输场景&#xff1a; ​ S1&#xff0c;S2&#xff0c;S3&#xff0c;S4 向 D 方向发送&#xff0c;R4 发生拥塞。R4 必须丢弃一些数据进行疏导反馈拥塞信号&#xff0c;否则谁也过不去。 优先丢掉离得最近的 S4 的数据&#xff0c;其次依次丢 S3&#xff0c;S2…

051:cesium加载mapbox的多种Style形式地图

第051个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中加载mapbox的多种Style形式地图,包括dark-v11,streets-v12,navigation-night-v1,outdoors-v12,satellite-v9,satellite-streets-v12,light-v10。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实…

如何让心情保持平静?100多条禅修心法

静的层次和阶段 静首先是不要去争&#xff0c;没有任何争的心&#xff0c;没有任何杂念心。静有几个层次阶段&#xff1a; ⒈. 自己的心情相对于自己平静&#xff0c;是平静的第一个阶段。 ⒉. 第二个平静的阶段是&#xff1a;别人觉得你很静&#xff0c;自己也很静&#xf…

ArduPilot开源飞控系统之简单介绍

ArduPilot开源飞控系统之简单介绍1. 源由2. 了解&阅读2.1 ArduPilot历史2.2 关于GPLv32.3 ArduPilot系统组成2.4 ArduPilot代码结构3. 后续4. 参考资料ArduPilot是一个可信赖的自动驾驶系统&#xff0c;为人们带来便利。为此&#xff0c;提供了一套全面的工具&#xff0c;几…

人人看得懂的AI教程

人人看得懂的AI教程&#xff0c;从0开始入门AI教程&#xff0c;一步一步AI&#xff0c;人工智能学习笔记 现在写书真的方便&#xff0c;闲来无事写了本从0开始学AI的书籍&#xff0c;哈哈 一、基础知识 1.1 人工智能概览 1.2 机器学习 1.3 深度学习 1.4 数据科学 二、编程知…

Stable Diffusion - API和微服务开发

Stable Diffusion 是一种尖端的开源工具&#xff0c;用于从文本生成图像。 Stable Diffusion Web UI 通过 API 和交互式 UI 打开了许多这些功能。 我们将首先介绍如何使用此 API&#xff0c;然后设置一个示例&#xff0c;将其用作隐私保护微服务以从图像中删除人物。 推荐&…

CoreDNS 性能优化

CoreDNS 作为 Kubernetes 集群的域名解析组件&#xff0c;如果性能不够可能会影响业务&#xff0c;本文介绍几种 CoreDNS 的性能优化手段。合理控制 CoreDNS 副本数考虑以下几种方式:根据集群规模预估 coredns 需要的副本数&#xff0c;直接调整 coredns deployment 的副本数:k…

总结下Spring boot异步执行逻辑的几种方式

文章目录概念实现方式Thread说明Async注解说明线程池CompletableFuture&#xff08;Future及FutureTask&#xff09;创建CompletableFuture异步执行消息队列概念 异步执行模式&#xff1a;是指语句在异步执行模式下&#xff0c;各语句执行结束的顺序与语句执行开始的顺序并不一…

【高项】项目人力资源管理,沟通管理与干系人管理(十大管理)

【高项】项目人力资源管理&#xff0c;沟通管理与干系人管理&#xff08;十大管理&#xff09; 文章目录1、人力资源管理1.1 什么是人力资源管理&#xff1f;1.2 如何进行人力资源管理&#xff1f;&#xff08;过程&#xff09;1.3 人力资源管理工具1.4 人力资源管理文件2、沟通…

自动驾驶BEV感知系列算法整理总结

序论 之前一直做的lidar感知&#xff0c;现在感觉大趋势是多传感器融合&#xff0c;所以博主也在向BEV下的融合框架学习&#xff0c;希望大家后面可以多多交流&#xff0c;下面会分为两类进行介绍&#xff0c;后期的文章会在下面两类中以小标题的形式出现&#xff0c;BEV下的两…

《推荐PlumGPT:一款优秀的聊天机器人》

PlumGPT是一款仿照ChatGPT的聊天机器人&#xff0c;它使用了最先进的自然语言处理技术来实现人机交互。PlumGPT不仅能够进行普通的对话&#xff0c;还可以回答各种问题&#xff0c;提供各种建议和信息。它能够对不同的话题做出详细的回答&#xff0c;例如科技、健康、娱乐、新闻…

[element]element-ui框架下载

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐如果觉得文章写的不错&#xff0c;欢迎点个关注一键三连&#x1f609;有写的不好的地方也欢迎指正&#xff0c;一同进步&#x1f601;…

线程同步与互斥【Linux】

文章目录1. 引入2. 前导概念2.1 同步与异步2.2 互斥与并发2.3 原子性操作2.4 临界资源和临界区临界资源临界区如何管理3. 互斥锁3.1 引入3.2 概念3.3 示例pthread_mutex函数家族用法全局锁局部锁3.4 性能损耗3.5 串行执行3.6 补充4. 互斥锁的实现原理4.1 线程的执行和阻塞4.2 自…

Java虚拟机对象

对象的创建 当虚拟机遇到一条字节码new指令时&#xff0c;首先检查指令的参数能否在常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已被加载、解析和初始化&#xff0c;如果没有就先执行类加载过程。 在类加载检查完毕后&#xff0c;就要对这个…

常见的7种软件规模估算方法 优劣势比较

业内主要的软件规模估算方法&#xff1a;LOC估算方法、故事点估算法、FPA功能点估算方法、COSMIC功能点估算方法、快速功能点估算方法、IFPUG功能点估算方法和自动化功能点估算方法。 1、LOC估算方法 LOC是源代码的总行数。通过统计源代码中的行数&#xff0c;来估算软件规模。…

Spring项目的创建和使用

Spring&#xff1a;Spring是一个包含众多工具方法的IoC容器&#xff1b; Spring的核心功能&#xff1a; 将对象&#xff08;俗称Bean&#xff09;存储到Sping容器中从容器中取出对象目录 一&#xff0c;创建Spring项目 1&#xff0c;创建一个Maven项目 2&#xff0c;添加Spri…