数组介绍 数组指的是一种容器,可以用来存储同种数据类型 的多个值
数组的初始化 C语言中的数组必须先定义,然后才能使用数组中保存的数据所谓初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程
不初始化 格式:数据类型 数组名[数组长度]; (数组元素值是不确定的,是内存中原有的数据)
例如:int arr[3];
部分初始化 例如:int arr[10] = {1,2,3}; (不完全初始化,剩余的元素默认初始化为0)
全部初始化 格式:数据类型 数组名[数组长度可以省略] = {元素1,元素2,元素3,….};
例如:int arr1[] = {11,22,33};
int arr2[3] = {11,22,33};
规定:数组一旦确定下来,长度不会再发生变化
数组元素的访问 格式:数组名[索引或者下标];
索引:索引是数组容器中每个元素的编号,编号从0开始,逐个+1增长
1 2 3 4 5 6 7 8 9 10 int arr[5 ] = {1 ,3 ,5 ,7 ,9 };printf (“%d\n”,arr[2 ]);printf (“%d\n”,arr[5 ]);int n = sizeof (arr)/sizeof (arr[0 ])for (int i=0 ; i < n; i++){ printf ("%d\n" ,arr[i]); }
sizeof函数
数组长度:sizeof(arr)/sizeof(arr[0]) 最大索引= 数组长度-1
获得整个数组在内存中所占的字节
数组中元素类型一致,所占内存一样
总字节数除以每个元素的字节数
数组元素的修改 在C语言中,数组的大小是固定的,一旦定义后就无法增加或删除元素。因此,没有内置的增加元素和删除元素的操作。
数组名[索引]= 新元素
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 32 33 34 35 36 37 38 39 #include <stdio.h> int main () { int a[] = { 8 , 9 , 10 ,100 ,23 ,54 ,65 }; int n = sizeof (a) / sizeof (a[0 ]); for (int i = 0 ; i < n; ++i) { printf ("%d " , a[i]); } printf ("\n" ); for (int i = 0 ; i < n/2 ; ++i) { int t = a[i]; a[i] = a[n - 1 - i]; a[n - i - 1 ] = t; } for (int i = 0 ,k = n-1 ; i < n/2 ; i++,k--) { int t = a[i]; a[i] = a[k]; a[k] = t; } for (int i = 0 ,k = n-1 ; i < k; i++,k--) { int t = a[i]; a[i] = a[k]; a[k] = t; } for (int i = 0 ; i < n; ++i) { printf ("%d " , a[i]); } printf ("\n" ); return 0 ; }
数组元素的排序 规律: 假设:有n个元素 1、需要进行(n-1)轮转换,每轮获取最大值; 2、每轮元素需要与后面的数进行比较,一共需要比较n-1次,但是每轮都获取该轮的最大值,再比较无意义,所以,每轮比较(n-轮数)次;
冒泡排序 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 #include <stdio.h> int main () { int a[10 ] = {21 , 42 , 31 , 15 , 16 , 37 , 18 , 39 , 9 , 10 }; for (int i = 0 ; i < 9 ; i++) { for (int j = 0 ; j < 9 ; j++) { if (a[j] > a[j + 1 ]) { int temp = a[j]; a[j] = a[j + 1 ]; a[j + 1 ] = temp; } } for (int j = 0 ; j < 10 ; j++) { printf ("%d " , a[j]); } printf ("\n" ); } 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 25 26 27 28 29 30 31 #include <stdio.h> int main () { int a[10 ] = {21 , 42 , 31 , 15 , 16 , 37 , 18 , 39 , 9 , 10 }; for (int i = 0 ; i < 9 ; i++) { int flag = 0 ; for (int j = 0 ; j < 9 -i; j++) { if (a[j] > a[j + 1 ]) { flag = 1 ; int temp = a[j]; a[j] = a[j + 1 ]; a[j + 1 ] = temp; } if (flag == 0 ) { break ; } } for (int j = 0 ; j < 10 ; j++) { printf ("%d " , a[j]); } printf ("\n" ); } return 0 ; }
二维数组 二维数组定义 数据类型 数组名 [行数] [列数];
例如:int arr1[3] [5];
字符数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include <stdio.h> #include <string.h> int main () { char d[] = "xyz123" ; char a[] = {'a' ,'b' ,'c' }; char b[] = {"abcd" }; char c[] = "abcde" ; printf ("sizeof(a):%lu\n" ,sizeof (a)); printf ("sizeof(b):%lu\n" ,sizeof (b)); printf ("sizeof(c):%lu\n" ,sizeof (c)); printf ("strlen(b):%lu\n" ,strlen (b)); printf ("strlen(c):%lu\n" ,strlen (c)); printf ("strlen(a):%lu\n" ,strlen (a)); printf ("%s,%s,%s\n" ,a,b,c); printf ("c[4]:|%c|\n" ,c[4 ]); printf ("c[5]:|%c|\n" ,c[5 ]); printf ("|%c|\n" ,32 ); printf ("%lu\n" ,sizeof ("中国人" )); return 0 ; }
注意事项: 使用字符数组定义字符串时,数组的长度应该比字符串的长度多1,以便容纳空字符。
使用指针方式定义字符串时,指针变量指向了字符串常量的首地址,无需指定数组长度。
二维字符数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include <stdio.h> int main () { char name[5 ][20 ] = {"Tom" ,"Jack" ,"xiaoming" ,"xiaohua" ,"Chinese" }; printf ("%s,%s\n" ,name[2 ],name[4 ]); for (int i=0 ;i<5 ;i++) { printf ("%s\n" ,name[i]); } printf ("%c\n" ,name[0 ][0 ]); printf ("|%c|,|%c|\n" ,name[0 ][3 ],name[0 ][19 ]); printf ("%c\n" ,name[1 ][3 ]); return 0 ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include <stdio.h> void printArr (int arr[],int n) { for (int i = 0 ; i < n; ++i) { printf ("%d " , arr[i]); } printf ("\n" ); } int main () { int a[10 ] = {1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 }; int b[5 ] = {2 ,4 ,6 ,8 ,10 }; printArr(a,10 ); printArr(b,5 ); char c[10 ]={0 }; scanf ("%s" ,c); printf ("%s\n" ,c); return 0 ; }