喜迎
春节

数组相关


1.一维数组

1.1.数组的定义

image-20230401112034336

c99中后来是支持定义动态数组的

1.2数组的初始化

image-20230401112542623

image-20230401112640431

2.二维数组

2.1数组的定义

image-20230401132322710

2.2数组的访问

image-20230401132359914

2.3数组的初始化

image-20230401132545850

image-20230401132841760

二维数组初始化,只有第一维可以不写长度,其他维度必须写上。

image-20230401133042724

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));

image-20230401135125049

可以看出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);

image-20230401135958487

可以看出,如果一开始就定义了数组的大小,不管插入了多少个元素,求出来的永远都是定义的数组的大小。

如果没有定义数组大小,那么算出来的就是你实际赋值的数组大小。

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);

image-20230401140529441

从 arr6 可以看出,当用sizeof求char类型的数组长度时,如果没有定义数组大小,那么得出的结果会比实际大小大1,因为sizeof把 \0也算进去了,这是字符串数组末尾自带的。

从arr7 和 arr8 看出,如果定义了数组的大小,无论如何都添加元素,求出的都是定义的数组的大小,如果想要求字符串的大小可以用strlen。

从arr10 看出,没有定义数组大小,用大括号赋值,可以求出正确的结果,strlen与这个相反。


文章作者: ljhaa
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ljhaa !
评 论
 上一篇
zero
zero
算法学习ZeroClass011. 简单的位运算介绍public class Demo01 { public static void print(int num) { for (int i = 3
2023-04-18
下一篇 
结构设计的坑
结构设计的坑
1.if语句常见的坑1.1 else悬挂else始终与最接近它的匹配 所以下面的这个else匹配的是if(isRain)的,并不是isFree的。 if (isFree == 'Y') if (isRain == 'Y')
2023-04-18
  目录