【04】数据结构与算法基础-类C语言有关操作补充 | 数组的静态、动态定义 | C、C++中内存分配 | C++中的参数传递方式-指针、数组、引用

news2024/11/28 6:44:59

目录

  • 1.元素类型说明
    • 1.1顺序表类型定义
    • 1.2数组定义
    • 1.3C语言的内存动态分配
    • 1.4C++的动态存储分配
      • 1.4.1创建内存
      • 1.4.2释放内存
    • 1.5C++中的参数传递
      • 1.5.1传值方式
      • 1.5.2传地址方式-指针变量
      • 1.5.3传地址方式-数组名
      • 1.5.4传地址方式-引用类型

1.元素类型说明

1.1顺序表类型定义

typedef struct{
	ElemType data[];
	int length;
}SqList; //顺序表类型

  其中的ElemType可以是char、float等数据类型,根据具体类型进行修改,也可以通过typedef char ElemType;或者typedef int ElemType;提前定义。如果是一个复杂数据类型变量,那么可以如下定义方式:

typedef struct{
	float p;
	int e;
}Polynomial

typedef struc{
	Polynomial *elem;
	int length;
}SqList;

1.2数组定义

数组静态分配:

typedef struc{
	ElemType data[MaxSize];
	int length;
}SqList;	//顺序表类型

  通过以上方式定义数组,需要的内存大小是固定的,数组名“data”存放的是第一个元素data[0]的地址,也就是首地址或基地址。
数动态分配

typedef struc{
	ElemType *data;
	int length;
}SqList;	//顺序表类型

  通过以上方式定义了一个指针变量,来存放指针的地址,内存大小可以使用内存动态分配函数来分配内存,也就是以下方式:

SqList L;
L.data=(ElemType*)malloc(sizeof(ElemType)*MaxSize);

1.3C语言的内存动态分配

malloc(m)函数,开辟m(m要求为整数)字节长度的地址空间,并返回这段空间的首地址;
sizeof(x)运算,计算变量x的长度;
free(p)函数,释放指针p所指变量的存储空间,即彻底删除一个变量。
需要加载头文件:<stdlib.h>

1.4C++的动态存储分配

1.4.1创建内存

new 类型名T(初值列表) 
  功能:
  	申请用于存放T类型对象的内存空间,并依初值列表赋以初值
  结果值:
  	成功:T类型的指针,指向新分配的内存
  	失败:0(NULL)

【应用举例】:

int *p1=new int;int *p1=new int(10);

  new也是得到空间的地址,需要赋值给指针变量。

1.4.2释放内存

delete 指针P
功能:
	释放指针P所指向的内存。P必须是new操作的返回值

【应用举例】:

delete p1;

1.5C++中的参数传递

  函数调用时传送给形参便的实参必须与形参保持三个一致:类型、个数、顺序。参数传递有两种方式:传值方式(参数为整型、实型、字符串等);传地址(参数为指针变量、引用类型、数组名)。

1.5.1传值方式

  把实参的值传送给函数局部工作区相应的副本中,函数使用这个副本执行必要的功能。函数修改的是副本的值,实参的值不变。

#include<iostream>
using namespace std;
void swap(float m, float n)
{
	float temp;
	temp = m;
	m = n;
	n = temp;
}
void main()
{
	float a, b;
	cin >> a >> b;
	swap(a, b);
	cout << "a=" << a << endl << "b=" << b << endl;
	system("pause");
}

运行结果
在这里插入图片描述
  上段程序首先输入a和b的值,然后调用swap函数,a赋值给m、b赋值给n,在函数中进行m和n值的调换,执行完函数后m和n的值被释放掉,回到调用函数swap的地方继续执行,对a和b的值不产生任何影响,此处是传递的值

1.5.2传地址方式-指针变量

  传地址方式,指针变量作为参数,形参的变化将影响实参。

#include<iostream>
using namespace std;
void swap(float *m, float *n)
{
	float temp;
	temp = *m;	//此处的*是取的m地址中的内容
	*m = *n;
	*n = temp;
}
void main()
{
	float a, b, *p1, *p2;
	cin >> a >> b;
	p1 = &a; p2 = &b;
	swap(p1, p2);
	cout << "a=" << a << endl << "b=" << b << endl;
	system("pause");
}

运行结果
在这里插入图片描述
  形参变化也可以不影响实参。

#include<iostream>
using namespace std;
void swap(float *m, float *n)
{
	float *temp;
	temp = m;	//此处temp被赋值为m的地址,对实际值无影响
	m = n;
	n = temp;
}
void main()
{
	float a, b, *p1, *p2;
	cin >> a >> b;
	p1 = &a; p2 = &b;
	swap(p1, p2);
	cout << "a=" << a << endl << "b=" << b << endl;
	system("pause");
}

运行结果
在这里插入图片描述

1.5.3传地址方式-数组名

  传递的是数组的首地址,对形参数组所做的任何改变都将反应到实参数组中。下面程序中的“b[]”可以用“*b”替代,都是指代数组a的地址。

#include<iostream>
using namespace std;
void sub(char b[])
{
	// 通过指针修改 a 数组的内容
	//伪代码:b[]="world";
	b[0] = 'w';
	b[1] = 'o';
	b[2] = 'r';
	b[3] = 'l';
	b[4] = 'd';
}
int main()
{
	char a[10] = "hello";
	sub(a);
	cout << "a=" << a << endl;
	system("pause");
	return 0;
}

运行结果
在这里插入图片描述
应用举例】:用数组作函数的参数,求10个整数的最大数。

#include<iostream>
using namespace std;
#define N 10
int max(int b[]);
int main()
{
	int a[10];
	int i, m;
	for (i = 0; i < N; i++)
	{
		cin >> a[i];
	}
	m = max(a);
	cout << "the max number is:" << m << endl;
	system("pause");
	return 0;
}
int max(int b[])
{
	int i, n;
	n = b[0];
	for (i = 1; i < N; i++)
	{
		if (n < b[i]) n = b[i];
	}
	return n;
}

运行结果
在这里插入图片描述

1.5.4传地址方式-引用类型

  引用是用来给一个对象提供一格替代的名字。例如下面程序中j将引用i,j是一个引用类型,代表i的一个替代名。i值改变时,j值也将改变,所以会输出“i=7,j=7”。也就是j取了i的地址,j和i共用了同一块内存空间。

#include<iostream>
using namespace std;
int main()
{
	int i = 5;
	int &j = i;
	i = 7;
	cout << "i=" << i << ",j=" << j << endl;
	system("pause");
	return 0;
}

运行结果
在这里插入图片描述
应用举例】:用引用类型交换a和b的值

#include<iostream>
using namespace std;
void swap(float& m, float& n)
{
	float temp;
	temp = m;
	m = n;
	n = temp;
}
int main()
{
	float a, b;
	cin >> a >> b;
	swap(a, b);	
	cout << "a=" << a << ",b=" << b << endl;
	system("pause");
	return 0;
}

运行结果
在这里插入图片描述
引用数据类型作为形参的三点说明

  1. 传递引用给函数与传递指针 的效果是一样的,形参变化实参也变化
  2. 引用类型作形参,在内存中并没有产生实参的副本,它直接对实参操作而一般变量作参数,形参与实参就占用不同的存储单元,所以形参变量的值是实参变量的副本。因此,当参数传递的数据量较大时,用引用比用一般变量传递参数的时间和空间效率都好;
  3. 指针参数虽然也能达到与使用引用的效果,但在被调函数中需要重复使用“*指针变量名”的形式进行运算,这很容易产生错误且程序的阅读性较差,另一方面,在主调函数的调用点处,必须用变量的地址作为实参。

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

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

相关文章

HDFS 的健壮性体现在哪里?

前言 本文隶属于专栏《大数据技术体系》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见大数据技术体系 正文 HDFS 的主要目标就是即使在出错的情况下也要保…

Linux进程间通信(消息队列)

可以用命令“ipcs”查看三种 IPC&#xff0c;“ipcrm”删除 IPC 对象。在 i.MX6ULL 终结者开发板终端输入“ipcs” 查看系统中存在的 IPC 信息&#xff1a; 这些 IPC 对象存在于内核空间&#xff0c;应用层使用 IPC 通信的步骤为&#xff1a; 1. 获取 key 值&#xff0c;内核…

【网络】交换机的原理和配置方法

目录 &#x1f341;交换机工作原理 &#x1f341;交换机接口的双工模式 &#x1f341;交换机命令行模式 &#x1f341;交换机常见命令 &#x1f9e7;帮助命令 &#x1f9e7;常用命令介绍 &#x1f341;交换机的基本配置 &#x1f9e7;配置接口的双工模式及速率 &#x1f990;博…

数据库误删恢复

说明 经常听说删库跑路这真的不只是一句玩笑话&#xff0c;若不小心删除了数据库&#xff0c;事情很严重。你一个不小心可能会给公司删没。建议研发不要直连生成环境&#xff0c;一般的话都会分配账号权限&#xff0c;生产环境的账号尽量是只读&#xff0c;以防你一个不经意给库…

java快速结束嵌套循环

java快速结束嵌套循环 快速结束for循环 out:for (int i 0; i < 5; i) {in:for (int j 0; j < 5; j) {if (j 2) {break out;}System.out.println("i " i " j " j);}}解释 将外层for循环起别名 o u t \color{red}{out} out,将内层for循环起别名…

Java NIO-非阻塞I/O(一)

文章目录 1. 简介2. 一个示例服务器3. 缓冲区4. 创建缓冲区5. 填充与排空6. 批量方法7. 数据转换8. 视图缓冲区9. 压缩缓冲区10. 复制缓冲区11. 分片缓冲区 1. 简介 与CPU和内存相比&#xff0c;甚至和磁盘相比&#xff0c;网络都很慢&#xff0c;但要允许CPU速度高于网络&…

YOLOV8最强操作教程.

YoloV8详细训练教程. 相信各位都知道yolov8发布了&#xff0c;也是U神大作&#xff0c;而且V8还会出论文喔&#xff01; 2023.1.17 更新 yolov8-grad-cam热力图可视化链接 2023.1.20 更新 YOLOV8改进-添加EIoU,SIoU,AlphaIoU,FocalEIoU 链接 2023.1.30 更新 如果你需要修改或者…

Vector Scope

下面以PicoScope 6403E-034为例说明 1.Scope 硬件结构介绍 前面板&#xff1a; 最多支持捕获2路CAN/CANFD/FlexRay总线&#xff0c;或者4路LIN总线 后面板&#xff1a; Scope Bus Probe 300 Mhz 2.Option Scope使用条件 前提条件1&#xff1a;购买CANoe/CANalyzer Option Sc…

03-SpringBoot3JDK9~17新特性

1、JDK9新特性---jshell交互式工具 前提是已经配置好了Jdk的环境变量。 2、JDK9新特性---模块化开发 需求&#xff1a; testA可以被模块A调用&#xff0c;testB可能是内部工具类&#xff0c;不想被模块A调用&#xff0c;又不能设置成private。 这时候我们就会用到模块化开发。…

vue3+element-plus+ts elplus table 实现表格动态列 表格列显示与隐藏的动态控制 支持传递插槽与多级表头

如题 先上效果 部分代码展示 Home页面 使用时除了名字不同其他没啥不同,但是我这个封装的函数或者属性较少,如果需要请自行增加 <script setup lang"ts"> import { IPage } from /mixins/pagination import { TableKey } from /types/enum import { useRou…

Vue3-01-Vue3 新特性及环境搭建

Vue.js是一种被广泛使用的JavaScript框架&#xff0c;用于构建用户界面和单页面应用。Vue3是其最新的主要版本&#xff0c;引入了许多新特性并做了一些改进。 一、Vue3 性能提升 1. Object.defineProperty VS Proxy Vue2 和 Vue3 在数据响应性系统的实现上采用了不同的方式&…

通则ZLT X21 CPE使用指南

目录 设备介绍应用场景案例详细配置CPE基本配置网络实现DMZ方式实现网络互通IP Passthrough方式实现网络互通 注意事项 设备介绍 ZLT X21 是一款高性能5G室内CPE&#xff0c;支持NR(SA&NSA)、TDD-LTE、FDD-LTE&#xff0c;将蜂窝网络数据转换为WIFI和有线网口数据&#xf…

【项目实战】博客系统设计与实现

一、项目概述 1.项目需求 前端&#xff1a;展示文章&#xff0c;文章分类&#xff0c;评论&#xff0c;用户登录。 后端 &#xff1a;系统管理&#xff1a;用户管理&#xff0c;菜单管理&#xff0c;角色管理。内容管理&#xff1a;文章管理&#xff0c;分类管理&#xff0c;标…

地震勘探基础(一)之地震波

地震波 纵波/P波 (Compressional Wave) &#xff1a;质点的动方向与波的传播方向一致。天然地震时&#xff0c;纵波造成地面上下颠簸震动&#xff0c;纵波先达到地表。 纵波速度与弹性参数的关系&#xff1a;纵波速度与体积模量&#xff0c;杨氏模量&#xff0c;剪切模量&…

tcpdump 抓包工具详细图文教程(下)

目录 一、tcpdump 常用参数的使用 1.1 tcpdump -i # 指定监听网络接口 1.2 tcpdump -w # 将捕获到的信息保存到文件中&#xff0c;且不分析和打印在屏幕 1.3 tcpdump -r # 从文件中读取数据 1.4 tcpdump -n # 不把 ip 转化成域名 1.5 tcpdump -t # 在每行的输出中不…

springboot自定义注解的使用++日志

1.添加切面依赖 <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.9</version> </dependency> 2.自定义注解 Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTI…

Java语言---PriorityQueue与堆

目录 一.堆 1.1堆的概念 1.2堆的存储方式 1.3堆的操作 1.3.1堆的创建 1.3.2代码的实现&#xff1a; 堆的插入元素 堆的删除 二、PriorityQueue 2.1概念 2.2性质 2.3PriorityQueue的创建构造 2.4PriorityQueue的操作方法 总结 &#x1f63d;个人主页&#xff1a;t…

堆的应用:Top-K问题

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下堆的应用--Top-K问题的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; 数据结构与算法专栏&#xff1a;数据结构与算法 个…

基于Web智慧油库三维可视化管理系统

油库是协调原油生产、原油加工、成品油供应及运输的纽带&#xff0c;是国家石油储备和供应的基地&#xff0c;它对于保障国防和促进国民经济高速发展具有相当重要的意义。 建设背景 石油作为重要的战略资源&#xff0c;关系着国家安全和人民生活。油库是石油能源供应链中的关…

俞浩“死磕”抖音,追觅科技618面临三变数

​文 | 智能相对论 作者 | 渡过 智能清洁“新秀”追觅科技来势汹汹。 创始人俞浩曾向媒体表示&#xff0c;“追觅科技……2023年做到行业技术第一&#xff0c;2024年做到行业市占率第一&#xff0c;2025年做到行业利润第一。” 具体到市场上&#xff0c;能拱火热度的电商节…