一维数组
数组是一组相同类型元素的集合。 数组创建方式:
type_t arr_name [const_n]
//type_t:数组元素类型。arr_name数组名。const_n常量表达式,指定数组大小。
int arr [10];
数组的初始化:在创建数组的同时给数组的内容一些合理初始值。 不完全初始化:
int arr[10] = {1,2,3} //其余元素默认初始化为0
::: warning
int arr1[5] = {'a','b'}; //数组中只有a、b两个元素,其余默认初始化为0
int arr2[5] = "ab"; //数组中有a、b、\0、三个元素,其余默认初始化为0
上述两种的存储结果是一样的,只是方式不同。 :::
char arr [5] = {a,98};
上述数组中的元素为a、b、\0,原因是98的ASCII码对应字母b。
char arr[] = "abcdefg";
上述数组没有指定大小,会根据输入内容自动确定数组大小,为元素个数加上“\0”。
sizeof和strlen
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "abcdefg";
printf("sizeof(arr)=%d\n", sizeof(arr));
printf("strlen(arr)=%d\n", strlen(arr));
return 0;
}
sizeof(arr)=8
strlen(arr)=7
::: warning sizeof是运算符,是计算数组所占空间的大小(包括数组内元素和标识结尾的‘\0’),即n*1+1。 strlen是库函数,测量的是字符串的实际长度,以'\0'结束(不包括'\0'),即n。
strlen:只能针对字符串求长度 sizeof:计算变量、数组、类型的大小,单位是字节。 :::
#include <stdio.h>
#include <string.h>
int main()
{
//char arr[] = "abcdefg";
//printf("%d\n", sizeof(arr));
//printf("%d\n", strlen(arr));
char arr1[] = "abcde";
char arr2[] = { 'a','b','c','d','e' };
printf("sizeof(arr1)=%d\n", sizeof(arr1));
printf("sizeof(arr2)=%d\n", sizeof(arr2));
printf("strlen(arr1)=%d\n", strlen(arr1));
printf("strlen(arr2)=%d\n", strlen(arr2));
return 0;
}
sizeof(arr1)=6
sizeof(arr2)=5
strlen(arr1)=5
strlen(arr2)=34
上述代码中,数组arr1中元素为“a、b、c、d、e、\0”,数组arr2中元素为“a、b、c、d、e”。 可得sizeof(arr1)=6,sizeof(arr2)=5。 strlen计算从第一个元素到“\0”中间的元素个数,数组arr2在计算完“abcde”后没有遇到“\0”会继续向下寻找,因为数组arr2并没有指定数组大小,则strlen(arr2)的计算结果为随机值。
#include <stdio.h>
int main()
{
char arr1[] = "abcde";
char arr2[] = { 'a','b','c','d','e' };
char arr3[10] = { 'a','b','c','d','e' };
return 0;
数组的访问
打印数组中前3个元素:
#include <stdio.h>
int main()
{
char arr[] = { 'a','b','c','d','e','f'};
int i = 0;
for (i; i < 3; i++)
{
printf("%c", arr[i]);
}
return 0;
}
abc
计算字符型数组长度:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "abcdefg";
int len = strlen(arr1);
printf("%d\n", len);
int n = 0;
for (n; n < len; n++)
{
printf("%c", arr1[n]);
}
return 0;
}
7
abcdefg
计算整型数组长度:
#include <stdio.h>
int main()
{
int arr2[] = { 1,2,3,4,5,6,7,8,9 };
int sz = sizeof(arr2) / sizeof(arr2[0]);
printf("%d\n", sz);
int n = 0;
for (n; n < sz; n++)
{
printf("%d", arr2[n]);
}
return 0;
}
9
123456789
::: danger 数组元素写成""形式时,数组中包含“\0”。 数组元素写成{}形式时,数组中不包含“\0”。 使用strlen计算数组长度时,从首元素到“\0”为止,不包含“\0”。 使用sizeof计算数组长度时,包括数组内元素和标识结尾的‘\0’。 :::
一维数组的内存存储
打印数组中每一个元素在内存中的地址:
#include <stdio.h>
int main()
{
int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i; i < sz; i++)
{
printf("元素%d的地址为%p\n", i, &arr[i]);
}
return 0;
}
元素0的地址为0000000ACA2FF648
元素1的地址为0000000ACA2FF64C
元素2的地址为0000000ACA2FF650
元素3的地址为0000000ACA2FF654
元素4的地址为0000000ACA2FF658
元素5的地址为0000000ACA2FF65C
元素6的地址为0000000ACA2FF660
元素7的地址为0000000ACA2FF664
元素8的地址为0000000ACA2FF668
元素9的地址为0000000ACA2FF66C
由上述代码可得,数组中相邻元素在内存中的位置相差4(64位编译器中int类型占据4个字节),即数组在内存中连续存放。
二维数组
创建x行y列的二维数组:
int arr[x][y];
char arr[x][y];
double arr[x][y];
二维数组的初始化
int arr[3][5] = { 1,2,3,4,5,6,7,8,9 };
由上可得二维数组的元素填充是先行后列,其余未赋值元素默认初始化为0。 二维数组可以指定初始化元素的位置:
int arr[3][5] = { {1,2,3,4},{5,6},7,8,9 };
二维数组可以不指定行数,通过元素的初始化确定元素的行数:
int arr[][5] = { {1,2,3,4},{5,6} };
::: warning 二维数组的行和列不能同时省略。 二维数组行可以省略,列不能省略。 :::
二维数组的使用
打印出二维数组:
#include <stdio.h>
int main()
{
int arr[2][5] = { {1,2,3,4},{5,6} };
int m = 0;
for (m; m < 2; m++)
{
int n = 0;
for (n; n < 5; n++)
{
printf("%d",arr[m][n]);
}
printf("\n");
}
return 0;
}
12340
56000
::: tip 二维数组和一维数组一样通过下标访问。 :::
二维数组的内存存储
#include <stdio.h>
int main()
{
int arr[2][5] = { {1,2,3,4},{5,6} };
int m = 0;
for (m; m < 2; m++)
{
int n = 0;
for (n; n < 5; n++)
{
printf("&arr[%d][%d]=%p\n",m,n,&arr[m][n]);
}
}
return 0;
}
&arr[0][0]=0000004F8DCFF868
&arr[0][1]=0000004F8DCFF86C
&arr[0][2]=0000004F8DCFF870
&arr[0][3]=0000004F8DCFF874
&arr[0][4]=0000004F8DCFF878
&arr[1][0]=0000004F8DCFF87C
&arr[1][1]=0000004F8DCFF880
&arr[1][2]=0000004F8DCFF884
&arr[1][3]=0000004F8DCFF888
&arr[1][4]=0000004F8DCFF88C
由上图可知,二维数组中每一行的元素地址相差4个字节,第一行和第二行元素也相差4个字节。即二维数组在内存中也是连续存放的。二维数组本质是由一维数组组成的。
如下图,可以将二维数组以行拆分为多个一维数组,例如arr[0][n],n为二维数组列号,该一维数组的元素下标。 ::: tip 访问数组中元素的方式是数组名+下标。 一维数组:arr+[n] 拆分后的二维数组:arr[m]+[n] :::