数组和指针
前言
-
数组
声明、实例化、初始化和访问;
数组的基本操作和排序;
System.Array类 -
C#的指针和不安全代码
数组
- 数组是一种数据结构,它包含相同类型的一组数据
int[] A;
A = new int[3];//简单的一维数组
-
数组必须先声明:
-
类型名称[] 数组名;
-
数组在声明后必须实例化才能使用:
-
数组名称 = new 类型名称[数组长度];
一条语句完成声明与实例化
int[] A = new int[3];
类型名称[] 数组名称 = new 类型名称[数组长度];
实例化时,可以为数组元素指定初始化值
int[] A = new int[3] {1,3,5};
数组名称 = new 类型名称[数组长度] {初始值设定项};
int[] A = new int[] {1,3,5};
int[] A = {1,3,5};
int[] A; A = {1,3,5};
int[] A = new int[3];
A[0] = 1;
A[1] = 3;
A[2] = 5;
数组的维度(秩)
int[] A = new int[3];//一维数组
int[,] A = new int[4, 2];//二维数组
int[, ,] A = new int[3, 5, 2];//三维数组
…….
int[,…,] A = new int[3, 5, … , 2];//n维数组
- 数组下标(索引)从0开始
- 数组元素可以为任何数据类型,包括数组类型
- 数值数组元素的默认值设置为0,而引用元素的默认值设置为 null
- 交错数组是数组的数组,它的元素是引用类型,初始化为 null
- 数组中的元素总数是数组中各维度长度的乘积
- 通过.NET框架中的System.Array类来支持数组
一维数组
int[] mark= new int[100]; //声明有100个整数的数组
Random rNum = new Random(); //生成随机数
int i,sumMark=0,avgMark,overAvg=0;
for (i = 0; i < 100; i++)
{
mark[i] = rNum.Next(101); //随机生成学生成绩(0~100)
sumMark += mark[i]; //统计成绩总和
}
avgMark = sumMark / 100; //求平均成绩
for (i = 0; i < 100; i++) //统计高于平均成绩的学生人数
{
if (mark[i] > avgMark) overAvg++;
}
for (i = 0; i < 100; i++)
{
if (mark[i] > avgMark) overAvg++;
}
C#语言还可以通过foreach语句来枚举数组的各个元素
foreach (int mm in mark)
{
if (mm> avgMark) overAvg++;
}
交错数组——数组的数组
元素为数组的数组,元素的维度和大小可以不同
正交数组、变长数组、锯齿形数组
int[][] jaggedArray = new int[3][];
jaggedArray[0] = new int[5];
jaggedArray[1] = new int[4];
jaggedArray[2] = new int[2];
int[][,] jaggedArray = new int[3][];
{
new int[,] = {{1,3},{5,7}};
new int[,] = {{0,2},{4,6},{8,10}};
new int[,] = {{11,22},{99,88},{0,9}};
}
数组的基本操作和排序
- 数组求和、求平均值、最值及其位置
- 数组的排序,如冒泡法、选择法
- 插入数据到已排序的数组中;删除已排序的数组中某一元素
选择排序:
int N = A.Length; //获取数组A的长度N
for (int loop = 0; loop <= N - 2; loop++)//外循环进行N-1轮比较
{
MinI = loop;
for (i = loop; i <= N - 1; i++) //内循环中在无序数中找最小值
if (A[i] < A[MinI]) MinI = i;
//最小值与无序数中的第一个元素交换
t = A[loop];
A[loop]=A[MinI];
A[MinI] = t;
}
作为对象的数组
System.Array类提供的常用方法和属性如表5-4所示
- Array.Clear(…);
- 源数组名.CopyTo(…);
- Array.Copy(…);
- 数组名.GetLength(维度);
- 数组名.Length;
- Array.Reverse(…);
- Array.Sort(数组名);
- 数组名.GetLowerBound(); 数组名.GetUpperBound();
- 数组名.Rank;
C#的指针和不安全代码
-
为了保持类型安全,默认情况下,C# 不支持指针
-
C#通过使用 unsafe 关键字,可以定义不安全上下文,然后在不安全上下文中使用指针
-
在 C# 中,为了编译不安全代码,必须用/unsafe 编译应用程序
指针的声明
type* identifier;
void* identifier; // 允许但不推荐使用!
可以声明为指针类型的数据类型包括
- sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal 或 bool
- 任何枚举类型
- 任何指针类型
- 仅包含非托管类型的字段的任何用户定义的结构类型