目录
一、一维数组
数组的创建
数组是一组相同类型元素的集合。type_t arr_name [const_n]
int arr[10] = {1,2,3} //不完全初始化,因为可以放10个元素,但是只写了三个,剩下的元素默认初始化为0。
char arr2[5] = {'a', 'b'}; 存储两个字符,剩下的都是空字符,如果访问到了数组以外的,比如arr[5],那么就是随机值。
char arr3[5] = "ab"; 还存了\0
char arr4[] = "abcdef" 像这样,不写具体元素,那么就会根据后面的内容来自动生成相应空间的数组,这里就相当于arr4[6]。
sizeof(arr4)和strlen(arr4)结果是7和6。sizeof计算所占空间大小,单位是字节,计算变量、数组、类型的大小,会计算\0,是一种操作符。strlen计算字符串长度,遇到\0停止,只针对字符串长度,是一个库函数,需引头文件。
数组的访问:
int main()
{
char arr[] = "abcdef";
printf("%c\n", arr[3]);
return 0;
}
通过下标直接就能访问其中元素。如果全部访问:
int main()
{
char arr[] = "abcdef";
int i = 0;
for (i = 0; i < 6; i++)
{
printf("%c", arr[i]);
}
return 0;
}
整型数组:
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d\n", arr[i]);
}
return 0;
}
看一维数组在内存中的布局:
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("&arr[%d] = %p\n", i , &arr[i]);
}
return 0;
}
结果是每个数组元素的地址,这也是这个一维数组的内存中的布局。数组在内存中是连续存放的。下标从0开始。
二、二维数组
创建
int arr[3] [4]三行四列
int arr[3][4] = {1,2,3,4,5}; 一行放满,再放下一行。如果123放第一行,45放二行的话,三行可看作三个一维数组,那么{(1,2,3), (4,5)}结果预想的那样。
初始化
行列不能同时省去,int arr[][],列一定不能省略。当航省略时,行没有固定值,只有列数受限制。
使用
int arr[3][4] = { {1, 2, 3}, {4, 5} };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
二维数组在内存中的存储
int arr[3][4] = { {1, 2, 3}, {4, 5} };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("arr[%d][%d] = %p ", i, j, arr[i][j]);
}
printf("\n");
}
return 0;
也是连续存放,将每一行挪到一起,形成一行,连续存放。其实际上还是一维数组。
结束。