c#笔记-数组

news2024/12/27 12:22:02

数组

声明数组

数组是一种可以声明多个同类型变量的数据结构,能替你声明多个变量。
并且其中的值可以通过索引动态访问,可以搭配循环批量处理这些值。

数组类型的写法是,在目标类型后加上一对中括号。
数组值没有字面量,需要构造出来。

int[] arr1 = new int[10];//构造一个int数组,它里面有10个int
var arr2 = new int[10];//var能识别出数组类型,不需要在var后加中括号

访问内容

通过int访问

数组的元素通过变量后加一对中括号,并指示索引来访问他的第n个元素。
获取到的元素跟普通的int类型值是一样的。
可以为int变量赋值,可以接收int值,也可以进行数学运算。

int[] arr3 = new int[4];
arr3[0] = 12;
arr3[1] = 16;
arr3[2] = 64;
arr3[3] = arr3[0] + arr3[1];
Console.WriteLine(arr3[3] - arr3[2]);

他的索引不仅能使用字面量,也可以使用变量。

int[] arr5 = new int[10];
for (int i = 0; i < arr5.Length; i++)
{
	arr5[i] = i * i;
}
for (int i = 0; i < arr5.Length; i++)
{
	Console.WriteLine(arr5[i]);
}

通过Index访问

通过Index可以从后往前访问数组的元素。他的写法是在数字前写一个^

int[] arr6 = new int[10];
arr6[^1] = 18;
arr6[^2] = 16;
arr6[^3] = 14;
arr6[^9] = 2;
arr6[^10] = 1;
Console.WriteLine(arr6[0]);
Console.WriteLine(arr6[1]);
Console.WriteLine(arr6[7]);
Console.WriteLine(arr6[8]);
Console.WriteLine(arr6[9]);
  • var可以知道^1的类型是Index
  • ^1不是运算符,而是语法糖。它要求编译器构造一个Index类型的值。
  • ^1不是字面量,而是指令。所以无法声明Index的常量

也可以配合变量来构造一个Index

int[] arr7 = new int[2];
arr7[0] = 18;
Console.WriteLine(arr7[^arr7.Length]);

数组长度

索引越界

对数组元素的访问,只能访问有效索引。
有效索引从0开始数,总数量等于数组长度。所以最大的有效索引为数组长度-1

数组长度可以通过访问数组的.Length属性获取。

而对于Index类型来说,^1表示倒数第一个元素。相当于arr[arr.Length - 1]
Index的倒数最大有效值为数组的Length

无论使用int还是Index,如果访问了非法的索引,那么或报错索引越界
c#是类型安全语言。数组控制之外的元素依旧按照相同的逻辑访问,可能会访问到其他程序的内存。

数组长度可以为0,此时任何索引都是非法的。

长度固定

之前的类型都是简单类型。他们没有内容。
任何对值的修改都是通过修改变量本身来完成的。

而数组的元素,是数组的内容。可以在不修改他的变量的情况下,来改变它的值。
也因为数组的元素是数组的内容,所以你在使用他们前,不需要像变量一样先赋值初始值。

数组是一个基本的数据结构。它高效,但一旦完成声明,就不能再改变他的长度。
这是说你不能在不修改变量的情况下修改长度。你仍然可以新建一个数组,重新对数组变量赋值。

指针

引用类型

如果你直接用一个数组变量来给另一个数组变量赋值,你会发现他们会窜号。

int[] arr8 = new int[1];
int[] arr9 = arr8;
Console.WriteLine(arr8[0]);//0
Console.WriteLine(arr9[0]);//0
arr8[0] = 12;
Console.WriteLine(arr8[0]);//12
Console.WriteLine(arr9[0]);//12

这是因为数组是引用类型。引用类型是一些无法预测大小,内容过大,和一些躺枪的数据。
这些的数据(数组元素)是存放在内存上的。

·内存储存了程序的运行到哪的指令信息,和一些临时信息。
在你构建完数组元素后,这个数组的指针会作为临时信息(数组变量)创建到上。

区分一个数据是在上还是在上是不能靠他是引用类型还是值类型来分辨的。
例如一个int数组的元素int。他们都是固定大小的值类型int,但他们在堆上。

托管指针

什么是指针,你可以理解为:快捷方式。
就是你桌面上那个1kb大小的QQ,它记录的一个地址。
在你双击快捷方式的时候,会顺着它记录的地址,找到QQ那个500MB的安装路径,
然后打开那个真实的QQ程序。这个过程叫解指针

托管是指.Net可以控制的东西,比如分配,监视,回收,释放。
因此不同于c++的指针,c#用到的(给你用的)指针是安全的。

c#可以启用不安全代码,来使用和c++同款的不安全指针。

指针在32位程序占32bit,在64位程序占64bit。
32位程序只能用4G内存,因为同为32位的int也是能表示4G个数(正数21亿,负数21亿)。
64位程序中,指针占用双倍大小。所以天然占用更多内存。

引用类型特点

复制

一个赋值操作就是一个复制操作,数组直接用数组赋值时,就是在复制这个指针。
之后访问数组元素时,访问到的就是同一组元素。
在这里插入图片描述

只读

引用类型的变量设置只读,只是不能修改这个变量。
这个变量指向的实际数据是可以修改的。
在这里插入图片描述

比较

数组变量的值是一个指针。给变量做比较只会判断他们指向的地址是不是相同的。

int[] arr10 = new int[1];
int[] arr11 = new int[1];

Console.WriteLine(arr10[0] == arr11[0]);//True
Console.WriteLine(arr10.Length == arr11.Length);//True
Console.WriteLine(arr10 == arr11);//False

引用变量

引用变量可以创建对变量的指针。对引用变量的任何操作都会解指针后对原变量进行操作。

int i1 = 6;
ref int ri1 = ref i1;//必须声明时赋值
Console.WriteLine(i1);//6
Console.WriteLine(ri1);//6,相当于访问i1
ri1 = 10;//直接赋值会作用到原变量上
Console.WriteLine(i1);//10,会被修改
Console.WriteLine(ri1);//10

int[] arr12 = new int[6];
ri1 = ref arr12[0];//可以重新赋值
Console.WriteLine(arr12[0]);//0
ri1 = 50;
Console.WriteLine(arr12[0]);//50

默认值

数组创建后,它里面的元素是默认值。
对于指定的类型可以使用字面量default获得默认值。
对于没有指定的类型,可以在default后加个括号指定类型。

bool b = default;
Console.WriteLine(default(char));

默认值的逻辑是,对这个类型所占据的内存都设置为0。

  • 对于数字类型都是0
    • char也是数字类型,会被解读为一个字符编码为0的字符。
  • 对于bool类型是false
  • 对于引用类型,值为null

null也是一个字面量,表示不引用任何数据。所有的引用类型都可以使用null值。

int[][] arr13 = new int[5][];//数组是一个有效的类型,所以数组也可以有数组
for (int i = 0; i < arr13.Length; i++)
{
	arr13[i] = new int[6];//数组的默认值是null,无法使用
}
arr13[2][3] = 8;

null值自身可以被访问,如使用参与比较。但不能访问他的任何内容。

string s1 = null;//字符串也是引用类型
Console.WriteLine(s1 == null);//仅访问变量
Console.WriteLine(s1 == "hello");//仅访问变量
Console.WriteLine("hello".Length);//获取内容,字符串的长度
Console.WriteLine("hello"[2]);//获取内容,第3个字符
Console.WriteLine(s1.Length);//尝试获取null的内容,报错
Console.WriteLine(s1[2]);//尝试获取null的内容,报错

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

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

相关文章

海天注塑机KEBA系统数据采集

本文章只针对海天注塑机的KEBA系统&#xff0c;因为其他注塑机厂家也用KEBA系统&#xff0c;他们的采集方式可能不太一样&#xff0c;所以后续有时间我将写其他文章来解释&#xff08;默认你已经向海天采购了OPC组件&#xff09;。 一、采集原理 采集软件&#xff08;OPC cli…

electron+vue3全家桶+vite项目搭建【18】electron新建窗口时传递参数【url版】

文章目录 引入实现效果展示实现思路实现步骤1.调整主进程新建窗口的handle2.调整新建窗口函数3.封装url获取请求参数的工具 测试代码 引入 electronvue的项目中&#xff0c;我们通过传入页面路由来展开新的页面&#xff0c;就像vue-router的路由传参一样&#xff0c;我们可以利…

排序算法 — 桶排序

文章目录 桶排序介绍桶排序实现桶排序复杂度和稳定性桶排序复杂度桶排序稳定性 代码实现核心&总结 桶排序介绍 假设待排序的数组a中共有N个整数&#xff0c;并且已知数组a中数据的范围[0, MAX)。在桶排序时&#xff0c;创建容量为MAX的桶数组r&#xff0c;并将桶数组元素都…

【AUTOSAR】【通信安全】E2E

目录 一、概述 二、约束和假设 三、依赖模块 四、功能描述 4.1 开发错误 4.1.1 运行时错误 五、API接口 5.1 E2E Profile 接口 5.2 E2E其他接口 一、概述 该文档制定了PRS E2E协议的平台特定实现要求。这包括所使用的接口和数据类型。 E2E保护的概念假设在运行时应对…

探讨Redis缓存问题及解决方案:缓存穿透、缓存击穿、缓存雪崩与缓存预热(如何解决Redis缓存中的常见问题并提高应用性能)

Redis是一种非常流行的开源缓存系统&#xff0c;用于缓存数据以提高应用程序性能。但是&#xff0c;如果我们不注意一些缓存问题&#xff0c;Redis也可能会导致一些性能问题。在本文中&#xff0c;我们将探讨Redis中的一些常见缓存问题&#xff0c;并提供解决方案。 一、缓存穿…

云计算中的边缘计算技术及其应用

章节一&#xff1a;云计算和边缘计算的简介 随着互联网的发展&#xff0c;数据中心的规模不断扩大&#xff0c;云计算也成为了越来越受欢迎的计算模式。但是&#xff0c;云计算存在着一些问题&#xff0c;比如延迟较高&#xff0c;网络瓶颈&#xff0c;数据隐私和安全性等等。…

Canny边缘检测算法

文章目录 前言1、Canny边缘检测算法2、代码1函数 3、代码24、基于tensor数据的代码 前言 最近在向卷积神经网络里的数据预处理和数据增强部分加这个函数&#xff0c;记录一下。 1、Canny边缘检测算法 Canny边缘检测算法是一种经典的边缘检测算法&#xff0c;其基本原理如下&a…

榜单!直接式TPMS前装搭载率突破60%,哪些厂商在领跑

2016年&#xff0c;《乘用车轮胎气压监测系统的性能要求和试验方法》通过强制性国家标准技术审查&#xff1b;根据规定&#xff0c;自2020年1月1日起&#xff0c;所有中国市场在产乘用车将开始实施强制安装TPMS&#xff08;胎压监测系统&#xff09;的要求。 目前&#xff0c;…

vue项目前端解决跨域问题

在前后端分离项目中&#xff0c;跨域是一定会出现的问题&#xff0c;本文主要介绍跨域问题的解决思路&#xff0c;以及在vue项目中如何使用代理的方式在前端解决跨域问题&#xff0c;同时提供一个后段解决的方案。 1、产生原因 跨域问题产生的原因是浏览器的同源策略。浏览器同…

哪款蓝牙耳机便宜又好用?2023公认质量最好的蓝牙耳机推荐

哪款蓝牙耳机便宜又好用&#xff1f;现如今&#xff0c;市面上的蓝牙耳机越来越多&#xff0c;在选择增多的同时也有着不小的困惑&#xff0c;不知道哪款好用。针对这个问题&#xff0c;我来给大家推荐几款质量最好的蓝牙耳机&#xff0c;一起来看看吧。 一、南卡小音舱Lite2蓝…

安装kali虚拟机

1&#xff1a;kali是什么? kali 是由 Offensive Security 公司开发和维护的。它在安全领域是一家知名的、值得信赖的公司它甚至还有一些受人尊敬的认证&#xff0c;来对安全从业人员做资格认证。Kali 也是一个简便的安全解决方案。Kali 并不要求你自己去维护一个 Linux 系统&…

u盘中病毒文件被隐藏怎么恢复?看看这三种方法

U盘是我们日常生活中常用的存储设备&#xff0c;但是如果U盘被病毒感染&#xff0c;可能会导致文件被隐藏或丢失。被病毒隐藏的U盘文件给我们的生活、工作带来了很大的麻烦&#xff0c;因此必须马上采取行动来恢复这些文件。 而解决“u盘文件被病毒隐藏如何恢复正常”的问题原来…

SpringBoot【运维实用篇】---- 日志

SpringBoot【运维实用篇】---- 日志 1. 代码中使用日志工具记录日志教你一招&#xff1a;优化日志对象创建代码 2. 日志输出格式控制3. 日志文件 运维篇最后一部分我们来聊聊日志&#xff0c;日志大家不陌生&#xff0c;简单介绍一下。日志其实就是记录程序日常运行的信息&…

网络安全是一个好的专业吗?

近年我国《网络安全法》政策持续落地&#xff0c;前段时间国家工信部出台意见&#xff0c;加强数据安全、网络安全、功能安全等管理、智能网联汽车安全是关键。针对上次滴滴安全安全审查一事当中&#xff0c;国家网信办强调企业无论在哪上市必须确保国家网络安全安全及关键信息…

UFC718AE01 HIEE300936R0101什么是 ABB 分布式控制系统?

​ UFC718AE01 HIEE300936R0101什么是 ABB 分布式控制系统&#xff1f; 关于 ABB 类别 什么是 ABB 分布式控制系统&#xff1f; ABB 的分布式控制系统 (DCS) 旨在改变多方面、全天候 24 小时的工业流程。ABB 的控制架构持续分析和推动工厂生产力&#xff0c;最大限度地提高资产…

Mysql数据库的存储引擎——必看教程

目录 一、什么是存储引擎 二、MySQL支持的存储引擎 三、常见的存储引擎 1.InnoDB存储引擎 2.MyISAM存储引擎 3.MEMORY存储引擎 四、选择存储引擎 总结 ✨✨✨大家好&#xff0c;我是会飞的鱼-blog&#xff0c;今天我来给大家介绍一下Mysql&#xff0c;有不足之处&#xf…

从 Windows 10/11、7/8 上清空回收站后恢复已删除文件的 6 种方法

Windows&#xff08;包括 Windows 11、10、8、7 和 Vista&#xff09;上的回收站用于回收您打算删除的不需要的文件。如果您删除了一些重要的文件或文件夹并且不小心清空了回收站&#xff0c;您仍然有机会恢复从回收站中删除的文件。这是一个教程&#xff0c;将阐明“如何在清空…

机器学习 day11(决策边界,损失函数)

逻辑回归模型的预测过程 通常来说&#xff0c;我们先选择一个阈值0.5&#xff0c;当f(x) > 0.5时&#xff0c;则预测y为1&#xff0c;当f(x)&#xff1c;0.5时&#xff0c;则预测y为0。由此我们可以得出&#xff0c;当阈值取0.5时&#xff0c;g(z)取0.5&#xff0c;z取0。…

想回西安

五一假期结束了&#xff0c;开始营业总结下跟读者们的交流。 特别感谢大家让我在自己的技术号里面写一些和生活相关的事情&#xff0c;现在正常营业&#xff0c;回复下读者的问题。 问题 发哥&#xff0c;我现在有个疑惑能麻烦帮我解答下嘛。 我已经工作一年多了&#xff0c;但…

这就是实力~ 腾讯云大咖亲码 “redis深度笔记” 无废话全精华

前言 作为这个时代码代码的秃头人员&#xff0c;对Redis肯定是不陌生的&#xff0c;如果连Redis都没用过&#xff0c;还真不好意思出去面试&#xff0c;指不定被面试官吊打多少次。 毕竟现在互联网公司和一些创业公司都要用到Redis&#xff0c;像亚马逊、谷歌、阿里、腾讯都要…