1 一维数组 1.1 数组的创建 1 2 3 type_t arr_name [const_n];
1.2 数组的初始化 1 2 3 4 5 6 7 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" ;
1 2 3 4 5 6 7 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));
sizeof 计算大小;strlen 求字符串对的长度,遇到\0 才停止,求得是 \0 前的长度。
1.3 一维数组的使用 使用下标访问
1 2 char arr[] = "abcdef" ;printf ("%c\n" ,arr[3 ]);
1.4 一维数组的存储 ==数组在内存中是连续存放的==
2 二维数组 2.1 二维数组的创建
2.2 二维数组的初始化 1 2 3 int arr[3 ][4 ] = {1 ,2 ,3 ,4 };int arr[3 ][4 ] = {{1 ,2 },{4 ,5 }};int arr[][4 ] = {{2 ,3 },{4 ,5 }};
2.3 二维数组的使用 使用下标访问
1 2 3 4 5 6 7 8 9 10 11 12 13 int main () { int arr[3 ][4 ] = { {1 ,2 ,3 },{4 ,5 ,6 } }; int i = 0 ; for (i = 0 ;i < 3 ; i++) { int b = 0 ; for (b = 0 ; b < 4 ; b++) { printf ("%d " , arr[i][b]); } printf ("\n" ); } }
2.4 二维数组的存储
3 数组作为函数参数 当数组传参的时候,实际上只是把数组的首元素的地址传递过去了。 所以即使在函数参数部分写成数组的形式:int arr[] 表示的依然是一个指针:int *arr 。
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 26 27 28 29 30 31 void bubble_sort (int arr[], int sz) { int i = 0 ; for (i = 0 ; i < sz - 1 ; i++) { int j = 0 ; for (j = 0 ; j < sz - i - 1 ; j++) { if (arr[j] > arr[j + 1 ]) { int tmp = arr[j]; arr[j] = arr[j + 1 ]; arr[j + 1 ] = tmp; } } } }int main () { int arr[] = { 3 ,1 ,7 ,5 ,8 ,9 ,0 ,2 ,4 ,6 }; int sz = sizeof (arr) / sizeof (arr[0 ]); bubble_sort(arr, sz); int i = 0 ; for (i = 0 ; i < sz; i++) { printf ("%d " , arr[i]); } return 0 ; }
当数组本来就是按升序的顺序,但是程序还是会一个一个比较,如何优化?使用标签判断数组是否为升序得顺序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 void bubble_sort (int arr[], int sz) { int i = 0 ; for (i = 0 ; i < sz - 1 ; i++) { int flag = 1 ; int j = 0 ; for (j = 0 ; j < sz - i - 1 ; j++) { if (arr[j] > arr[j + 1 ]) { int tmp = arr[j]; arr[j] = arr[j + 1 ]; arr[j + 1 ] = tmp; flag = 0 ; } } if (flag==1 ) { break ; } } }
4 数组名是什么 1 2 3 4 5 6 7 8 9 10 #include <stdio.h> int main () { int arr[10 ] = {1 ,2 ,3 ,4 ,5 }; printf ("%p\n" , arr); printf ("%p\n" , &arr[0 ]); printf ("%d\n" , *arr); return 0 ; }
数组名是数组首元素的地址。但有两个例外
sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组。
&数组名,取出的是整个数组的地址。&数组名,数组名表示整个数组。 除此1,2两种情况之外,所有的数组名都表示数组首元素的地址。