1.数组是一组有序数据的结合,且一个数组中只能存放一种类型的元素,例如:
(1)用int 创建数组arr1,数组arr1只能存储整型元素。
int arr[]={0,1,2,3,4,5,6,7,8,9};
(2)用char创建数组arr1,数组arr1只能存储字符型元素。
char arr2[]={'h','e','l','l','o','w','o','r','l','d'};
2.一维数组
(1)一维数组的创建和初始化
初始化分为完全初始化和不完全初始化。
完全初始化(为数组的每个空间都加入元素):
int arr3[5]={1,2,3,4,5};
不完全初始化(虽为数组开辟了空间,但只有部分空间加入了元素,其他空间默认为0):
int arr4[5]={1,2};
(3)如果创建数组时没有指定数组空间大小,则自动按照初始化的元素个数开辟空间,例如:
int arr5[]={1,2,3,4,5,6,7,8,9,10};
数组自动根据10个元素开辟10个空间大小用于存储。
(4)一维数组在内存中的存储方式(可以通过打印各个元素的地址以观察):
#include <stdio.h>
int main()
{
int arr6[10] = { 0 };
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%p\n", &arr6[i]);
}
return 0;
}
运行结果如下:
由结果不难看出,一维数组在内存中的存储是连续的,相差4的原因是每个整型元素是占4个字节的,而一个地址只能存储一个字节,所以存储一个整形元素在内存中需要4个地址。
3.二维数组
(1)二维数组的创建和初始化
二维数组的创建与初始化和一维数组类似,也分完全初始化和不完全初始化。
完全初始化:
int arr7[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
arr7 | [0] | [1] | [2] | [3] |
[0] | 1 | 2 | 3 | 4 |
[1] | 5 | 6 | 7 | 8 |
[2] | 9 | 10 | 11 | 12 |
不完全初始化:
int arr8[3][4]={{1,2},{3,4},{5,5}};
arr7 | [0] | [1] | [2] | [3] |
[0] | 1 | 2 | 0 | 0 |
[1] | 3 | 4 | 0 | 0 |
[2] | 5 | 5 | 0 | 0 |
(2)二维数组在内存中的存储(亦可通过打印地址来观察):
#include <stdio.h>
int main()
{
int arr9[3][4] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
printf("arr9[%d][%d]的地址是:%p\n", i, j, &arr9[i][j]);
}
}
return 0;
}
运行结果如下:
由运行结果不难看出,二维数组在内存中的存储也是连续的。
4.数组使用的几点注意事项
(1)当数组作为函数的参数时,传进去的是数组首元素的地址;
(2)&数组名、数组名打印出来都是相同的结果。但是含义不同,如下:
#include <stdio.h>
int main()
{
int arr10[] = { 0,1,2,3,4,5,6,7,8,9 };
printf("%p\n", &arr10);
printf("%p\n", &arr10+1);
printf("------------------------------\n");
printf("%p\n", arr10);
printf("%p\n", arr10+1);
}
运行结果如下:
&数组名是取了整个数组的地址,但是打印的是数组空间的起始位置地址;而打印数组名实则是打印数组第一个元素的地址。