第7章 数组
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
18
7.2.3 二维数组的静态初始化 静态初始化数组时,必须与数组定义结合在一起,否则会出错。 静态初始化数组的格式如下: 数据类型[,] 数组名={{元素值0,0,元素值0,1,,元素值0,n-1}, {元素值1,0,元素值1,1,,元素值1,n-1}, {元素值m-1,0,元素值m-1,1,,元素值m-1,n-1}}; 例如:对整型数组myarr的静态初始化。 int[,] myarr={{1,2,3},{4,5,6}};
2. 给定初始值的情况 如果给出初始值部分,各元素取相应的初值,而且 给出的初值个数与“数组长度”相等。此时可以省略 “数组长度”,因为后面的大括号中已列出了数组中的 全部元素。 例如: int[] a = new int[10]{1,2,3,4,5,6,7,8,9,10}; 或 int[] a = new int[]{1,2,3,4,5,6,7,8,9,10}; 在这种情况下,不允许“数组长度”为变量, 例如: int n = 5; //定义变量n
8
7.1.5 值类型和引用类型
值类型和引用类型的区别在于,值类型在栈(Stack)上 分配,而引用类型(数组和string)在堆(Heap)上分配。 int[] arr = {1, 3, 5, 7, 9};
栈 堆
arr
1 3 5 7 9
•数组的各个元素在堆中分配,并按顺序依次排列。 •变量arr分配在栈中,它存放的是一个内存地址的指针,指向堆 中数组元素的地址
2
7.1 一维数组
7.1.1 一维数组的定义 定义一维数组的语法格式如下: 数组类型[] 数组名; 例如:定义了3个一维数组,即整型数组a、双精度数 组b和字符串数组c。 int[] a; double[] b; string[] c; 在定义数组后,必须对其进行初始化才能使用(声明 数组并不实际创建它们)。初始化数组有两种方法:动 态初始化和静态初始化。
arr1把它的值2046赋给了arr2,arr1和arr2表示的是同一个数组
值类型对象之间赋值将复制对象的内容, 引用类型对象之间的赋值则只是复制对象的引用地址, 而不是对象的内容。
12
Stack
Heap
s1
s2
John
Tom
代码
String s1 = “John”; String s2 = s1; s1 = “Tom”;
17
2. 给定初始值的情况 如果给出初始值部分,各元素取相应的初值,而且给出 的初值个数与对应的“数组长度”相等。此时可以省略 “数组长度”,因为后面的大括号中已列出了数组中的全 部元素。 例如: int[,] x = new int[2,3]{{1,2,3},{4,5,6}}; 或 int[,] x = new int[,]{{1,2,3},{4,5,6}};
int[] myarr = new int[n] {1,2,3,4,5}; //错误
如果给出“数组长度”,则初始值的个数应与“数组长 度”相等,否则出错。 例如: int[] mya = new int[2] {1,2}; //正确
int[] mya = new int[2] {1,2,3}; int[] mya = new int[2] {1}; //错误 //错误
19ቤተ መጻሕፍቲ ባይዱ
7.2.4 访问二维数组中的元素 为了访问二维数组中的某个元素,需指定数组名称和数 组中该元素的行下标和列下标。 例如:输出数组d的所有元素值。 int[,] d = new int[2,3]{{1,2,3},{4,5,6}}; int i,j; for (i=0;i<2;i++) for (j=0;j<3;j++) Console.Write("{0} ",d[i,j]); Console.WriteLine(); 对于多维数组,也可以使用foreach语句来循环访问每一 个元素 。 例如: int[,] myb = new int[3, 2] { {1, 2}, {3,4}, {5,6}}; foreach (int i in myb) Console.Write("{0} ", i); Console.WriteLine(); 以上两例均输出为:1 2 3 4 5 6。
C#程序设计基础教程与实训(第2版)
第 7章
数组
1
• 数组(Array),或称为数组数据类型是一种新的数据表 达。 • 数组是具有相同类型的一组数据。数组按照数组名、 数据元素的类型和维数来进行描述。 • 当访问数组中的数据时,可以通过下标来指明。 • 数组具有以下属性: (1) 数组可以是一维、多维或交错的。 (2) 数值数组元素的默认值设置为0或空。 (3) 数组的索引从0开始:具有n个元素的数组的索引是 0~n-1。 (4) 数组元素可以是任何类型,包括数组类型。
6
7.1.4 访问一维数组中的元素 访问一维数组中的某个元素:名称[下标或索引]。 所有元素下标从0开始,到数组长度减1为止。 例如:输出数组myarr的所有元素值: for (i=0;i<5;i++) Console.Write("{0} ",a[i]); Console.WriteLine(); C#还提供foreach语句。该语句提供一种简单、明了的方 法来循环访问数组的元素。 例如:定义一个名称为mya的数组,并用foreach语句循环 访问该数组。 int[] mya = {1,2,3,4,5,6}; foreach (int i in mya) System.Console.Write("{0} ",i); Console.WriteLine(); 输出为:1 2 3 4 5 6
10
【例7-2】值类型和引用类型
Stack
Heap
i1 i2
100 50 100
代码
int i1 = 100; int i2 = i1; i1 = 50;
11
Stack
Heap
arr1
arr2
2046
2046
0
1
2
3
4
500 1 3
5
7
9
代码
int arr1 = {1,3,5,7,9}; int arr2 = arr1; arr1[0] = 500;
20
例7-8 拼数字游戏 数组的元素可以成为任何对象,包括窗体控件。 本例把9个label控件放在一个3*3的二维数组中。
22
16
1. 不给定初始值的情况 如果不给出初始值部分,各元素取默认值。 例如: int[,] x = new int[3,2]; 该数组各数组元素均取默认值0。 声明创建了一个3行2列的二维数组: arr[0,0] arr[1,0] arr[2,0] arr[0,1] arr[1,1] arr[2,1]
15
7.2.2 二维数组的动态初始化 动态初始化二维数组的格式如下: 数据类型[,] 数组名=new 数据类型[m][n]{ {元素值0,0,元素值0,1,,元素值0,n-1}, {元素值1,0,元素值1,1,,元素值1,n-1}, {元素值m-1,0,元素值m-1,1,,元素值m-1,n-1} }; 其中,“数组类型”是数组中数据元素的数据类型, m、n分别为行数和列数,即各维的长度,可以是整型常 量或变量。
9
//-------------值类型 int i1 = 100; int i2 = i1; i1 = 50; Console.WriteLine("i1=" + i1 + "; i2=" + i2); //------------------引用类型(数组) int[] arr1 = { 1,3,5,7,9 }; int[] arr2 = arr1; arr1[0] = 500; int[] arr2 = new int [arr1.Length]; Console.Write("数组arr1的值为:"); arr1.CopyTo(arr2, 0); foreach (int i in arr1 ) { Console.Write(i + " "); } Console.Write("数组arr2的值为:"); foreach (int i in arr2 ) { Console.Write(i+ " "); } Console.WriteLine("\r"); //-------------引用类型(字符串) string s1 = "john"; string s2 = s1; s1 = "tom"; Console.Write ("s1=" + s1+"; s2="+ s2);
7
例7-1 冒泡排序法
i
j
10 8 3 15 26 11 30
int[] arr = new int[] { 10, 8, 6, 15, 26, 11, 30 }; for (int j = 1; j < arr.Length; j++) { for (int i = 0; i < arr.Length - j; i++) { if (arr[i] < arr[i + 1]) { int temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } } for (int i = 0; i < arr.Length; i++) { Console.Write(arr[i] + " "); }
•字符串类型更像值类型。 •字符串是一种特殊的引用类型,它是不可变的。 •字符串在创建后就不能改变,包括变长、变短和修改 其中的任何字符。 上例中改变字符串就导致产生一个新的字符串
13
14
7.2 二维数组
7.2.1 二维数组的定义 定义二维数组的语法格式如下: 数组类型[,] 数组名; 其中,“数据类型”为C#中合法的数据类型, “数组名”为C#中合法的标识符。 例如:定义了3个二维数组,整型数组x、双精度数 组y和字符串数组z。 int[,] x; double[,] y; string[,] z; 对于多维数组,可以作类似的推广, 例如,以下语句定义了一个三维数组p。 int[,,] p;
3
7.1.2 一维数组的动态初始化 动态初始化需要借助new运算符,为数组元素分配内存空间,并
为数组元素赋初值,数值类型初始化为0,布尔类型初始化为false, 字符串类型初始化为null。 动态初始化数组的格式如下: 数组类型[] 数组名=new 数据类型[n]{元素值0,元素值1,,元素值n-1}; 其中,“数组类型”是数组中数据元素的数据类型, n为“数组长度”,可以是整型常量或变量, 后面一层大括号里为初始值部分。 1. 不给定初始值的情况 如果不给出初始值部分,各元素取默认值。 例如: int[] a = new int[10]; 4 该数组在内存中各数组元素均取默认值0。
5
7.1.3 一维数组的静态初始化 静态初始化数组时,必须与数组定义结合在一起,否则 会出错。 静态初始化数组的格式如下: 数据类型[] 数组名={元素值0,元素值1,,元素值n-1}; 用这种方法对数组进行初始化时,无需说明数组元素的 个数,只需按顺序列出数组中的全部元素即可,系统会自 动计算并分配数组所需的内存空间。 例如: 以下是对整型数组myarr的静态初始化: int[] myarr={1,2,3,4,5}; 在这种情况下,不能将数组定义和静态初始化分开。 例如: int[] myarr; myarr={1,2,3,4,5}; //错误的数组的静态初始化