大纲
一维数组的创建和初始化
一维数组的使用
一维数组在内存中的存储
二维数组的创建和初始化
二维数组的使用
二维数组在内存中的存储
数组作为函数参数
数组的应用实例1:三子棋
数组的应用实例2:扫雷游戏
一维数组 数组的创建 数组是一组相同类型元素的集合。 数组的创建方式:
1 2 3 type_t arr_name [const_n];
数组创建代码实例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main () { int arr[10 ]; char arr1[5 ]; int x = 2.1 ; float arr2[x]; return 0 ; }
注:数组创建, []中要给一个常量才可以,不能使用变量。
数组的初始化 数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。
代码实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main () { int arr1[10 ] = {1 ,2 ,3 }; int arr2[] = {1 ,2 ,3 ,4 }; int arr3[5 ] = {1 ,2 ,3 ,4 ,5 }; char arr4[3 ] = {'a' ,98 , 'c' }; char arr5[] = {'a' ,'b' ,'c' }; char arr6[] = "abcdef" ; printf ("%d\n" ,sizeof (arr6)); printf ("%d\n" ,strlen (arr6)); return 0 ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main () { char arr1[] = "abc" ; char arr2[] = {'a' ,'b' ,'c' }; printf ("%d\n" ,sizeof (arr1)); printf ("%d\n" ,sizeof (arr2)); printf ("%d\n" ,strlen (arr1)); printf ("%d\n" ,strlen (arr2)); return 0 ; }
✏️sizeof()和strlen的区别
一维数组的使用 对于数组的使用我们之前介绍了一个操作符: [ ]
,下标引用操作符。
代码实例1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main () { char arr[] = "abcdef" ; int i = 0 ; int len = strlen (arr); for (i=0 ;i<len;i++) { printf ("%c\n" ,arr[i]); } return 0 ; }
代码实例2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main () { int arr[10 ] = {0 }; int sz = sizeof (arr)/sizeof (arr[0 ]); int i = 0 ; for (i=0 ; i<sz; i++) { arr[i] = i; } for (i=0 ; i<sz; ++i) { printf ("%d " , arr[i]); } return 0 ; }
总结:
数组是使用下标来访问的,下标是从0开始。
数组的大小可以通过计算得到。
1 2 int arr[10 ];int sz = sizeof (arr)/sizeof (arr[0 ]);
一维数组在内存中的存储 接下来我们探讨数组在内存中的存储
代码实例:
输出结果
1 2 3 4 5 6 7 8 9 10 &arr[0] = 006FFEE0 &arr[1] = 006FFEE4 &arr[2] = 006FFEE8 &arr[3] = 006FFEEC &arr[4] = 006FFEF0 &arr[5] = 006FFEF4 &arr[6] = 006FFEF8 &arr[7] = 006FFEFC &arr[8] = 006FFF00 &arr[9] = 006FFF04
二维数组 二维数组的创建 1 2 3 4 5 6 7 8 9 10 11 12 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main () { int arr[3 ][4 ]; char arr[3 ][5 ]; double arr[2 ][4 ]; return 0 ; }
二维数组的初始化 1 2 3 4 5 6 7 8 9 10 11 12 13 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main () { int arr[3 ][4 ] = {1 ,2 ,3 ,4 }; int arr[3 ][4 ] = {{1 ,2 },{4 ,5 }}; int arr[][4 ] = {{2 ,3 },{4 ,5 }}; return 0 ; }
二维数组的使用 二维数组的使用也是通过下标的方式。
二维数组在内存中的存储 像一维数组一样,这里我们尝试打印二维数组的每个元素。
编译结果:
1 2 3 4 5 6 7 8 9 10 11 12 &arr[0 ][0 ] = 00 AFFD10 &arr[0 ][1 ] = 00 AFFD14 &arr[0 ][2 ] = 00 AFFD18 &arr[0 ][3 ] = 00 AFFD1C &arr[1 ][0 ] = 00 AFFD20 &arr[1 ][1 ] = 00 AFFD24 &arr[1 ][2 ] = 00 AFFD28 &arr[1 ][3 ] = 00 AFFD2C &arr[2 ][0 ] = 00 AFFD30 &arr[2 ][1 ] = 00 AFFD34 &arr[2 ][2 ] = 00 AFFD38 &arr[2 ][3 ] = 00 AFFD3C
✏️通过结果我们可以分析到,其实二维数组在内存中也是连续存储的。
数组作为函数参数 往往我们在写代码的时候,会将数组作为参数传个函数
比如:我要实现一个冒泡排序 ,函数将一个整形数组排序。
代码例:
方法1,出问题,那我们找一下问题,调试之后可以看到 bubble_sort函数内部的 sz,是1。
难道数组作为函数参数的时候,不是把整个数组的传递过去?
分析代码:
1 2 3 4 5 6 7 8 9 10 11 12 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main () { int arr[] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 }; printf ("%p\n" ,arr); printf ("%p\n" , &arr[0 ]); printf ("%p\n" , *arr); return 0 ; }
结论: 数组名是数组首元素的地址。(有两个例外)
✍补充:
sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组。
1 2 3 4 5 6 7 8 9 10 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main () { int arr[10 ] = { 0 }; printf ("%d\n" , sizeof (arr)); return 0 ; }
2.&数组名,取出的是数组的地址。&数组名,数组名表示整个数组。
除此1,2两种情况之外,所有的数组名都表示数组首元素的地址。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main () { int arr[] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 }; printf ("%p\n" , arr); printf ("%p\n" , arr+1 ); printf ("%p\n" , &arr[0 ]); printf ("%p\n" , &arr[0 ]+1 ); printf ("%p\n" , &arr); printf ("%p\n" , &arr+1 ); return 0 ; }
🚀代码优化
我们应该考虑到源数组排序已经是升序的情况
数组的应用实例 1:三子棋 在工程文件夹中建立game.h
,game.c
,test.c
代码例:
game.h
game.c
test.c
2:扫雷游戏(初级) ⚠️新建一个项目来存放编写此游戏代码,不然可能会和三子棋冲突
建立game.h
,game.c
,test.c
思路:
代码例:
game.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define EASY_COUNT 10 void InitBoard (char board[ROWS][COLS], int rows, int cols,char set ) ;void DisplayBoard (char board[ROWS][COLS],int row,int col) ;void SetMine (char board[ROWS][COLS], int row, int col) ;void FindMine (char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) ;
game.c
test.c