1.一维数组
1.1.数组的定义
c99中后来是支持定义动态数组的
1.2数组的初始化
2.二维数组
2.1数组的定义
2.2数组的访问
2.3数组的初始化
二维数组初始化,只有第一维可以不写长度,其他维度必须写上。
3.求数组的长度
3.1 strlen()
只能用来求字符串的长度,也就是char类型的数组,不能求int类型的
char arr6[] = "abc";//没有定义元素个数,用双引号定义3个字符,末尾数组会自动加上结束标志(\0)
printf("length arr6 = %d\n", strlen(arr6));
char arr7 [10] = "abc";//定义10个元素个数,用双引号赋值三个字符串,其余7个元素均自动定义为\0
printf("length arr7 = %d\n", strlen(arr7));
char arr8 [10] = {'a', 'b', 'c'};//定义10个元素个数,用大括号和单引号赋值三个字符串,则数组只含有三个字符,剩余7个均为\0
printf("length arr8 = %d\n", strlen(arr8));
char arr9 [10] = {'a', 98, '98'};//char定义数组,元素中出现没有用单引号的数字,会根据ASCII码输出字符
printf("length arr9 = %d\n", strlen(arr9));
char arr10 [] = {'a', 'b', 'c'};//没有定义元素个数,用大括号定义字符串,数组的元素个数则只有三个,结尾没有数组结束标志(\0)
printf("length arr10 = %d\n", strlen(arr10));
可以看出arr6和arr7是正确的结果,
arr10输入了3个字符,结果确实15个,因为没有定义数组的个数,用大括号的形式赋值,结尾没有 \0 ,所以不正确
反观 arr8 和 arr9 结果却是正确的,这是因为开始定义了数组的个数,没有初始化的会默认赋值为0,
3.2sizeof()
sizeof()可以求任何类型的数组的长度
sizeof能计算变量或者数据类型所占用的内存(以字节为单位)。用sizeof计算数组长度时,sizeof不关心数组内部存储的是什么类型的数据。
所以常常用 sizeof(arr)/sizeof(arr[0]) 来计算数组的长度。其中“sizeof(arr)“计算了整个数组arr占据了多少内存(字节为单位),”sizeof(arr[0])“计算了数组中第一个元素所占多少字节,两者相除就是数组的长度。
int arr1 [10] = {0};//定义了元素个数,且给第一个元素赋值为0,则其他元素均为0
int arr2 [10] = {1, 2, 3, 4, 5};//定义了元素个数,但只给前五个元素赋值,则后五个元素均为0
int arr3 [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//定义了元素个数,且给所有元素均赋值
int arr4 [10];//什么都不放,编译器会给数组的每个元素放置随机数。
int arr5[] = {1, 2, 3};//不定义元素个数,给几个元素赋值就有几个元素。
int len1 = sizeof(arr1) / sizeof(arr1 [0]);
int len2 = sizeof(arr2) / sizeof(arr2 [0]);
int len3 = sizeof(arr3) / sizeof(arr3 [0]);
int len4 = sizeof(arr4) / sizeof(arr4 [0]);
int len5 = sizeof(arr5) / sizeof(arr5 [0]);
printf("length arr1 = %d\n", len1);
printf("length arr2 = %d\n", len2);
printf("length arr3 = %d\n", len3);
printf("length arr4 = %d\n", len4);
printf("length arr5 = %d\n", len5);
可以看出,如果一开始就定义了数组的大小,不管插入了多少个元素,求出来的永远都是定义的数组的大小。
如果没有定义数组大小,那么算出来的就是你实际赋值的数组大小。
char arr6 [] = "abc";//没有定义元素个数,用双引号定义3个字符,末尾数组会自动加上结束标志(\0)
char arr7 [10] = "abc";//定义10个元素个数,用双引号赋值三个字符串,其余7个元素均自动定义为\0
char arr8 [10] = {'a', 'b', 'c'};//定义10个元素个数,用大括号和单引号赋值三个字符串,则数组只含有三个字符,剩余7个均为\0
char arr10 [] = {'a', 'b', 'c'};//没有定义元素个数,用大括号定义字符串,数组的元素个数则只有三个,结尾没有数组结束标志(\0)
int len6 = sizeof(arr6) / sizeof(arr6 [0]);
int len7 = sizeof(arr7) / sizeof(arr7 [0]);
int len8 = sizeof(arr8) / sizeof(arr8 [0]);
int len10 = sizeof(arr10) / sizeof(arr10 [0]);
printf("length arr6 = %d\n", len6);
printf("length arr7 = %d\n", len7);
printf("length arr8 = %d\n", len8);
printf("length arr10 = %d\n", len10);
从 arr6 可以看出,当用sizeof求char类型的数组长度时,如果没有定义数组大小,那么得出的结果会比实际大小大1,因为sizeof把 \0也算进去了,这是字符串数组末尾自带的。
从arr7 和 arr8 看出,如果定义了数组的大小,无论如何都添加元素,求出的都是定义的数组的大小,如果想要求字符串的大小可以用strlen。
从arr10 看出,没有定义数组大小,用大括号赋值,可以求出正确的结果,strlen与这个相反。