数组是一组相同类型元素的集合。
定义形式:
type_t arr_name[const_n];
const_n 为常量表达式;不可为变量。(C99才支持变量数组)
int arr[5]={1,2,3,4,5};
//等效于
int arr[]={1,2,3,4,5};
初始化字符型数组,未初始化的位置放置 ‘\0’
char[5]={'a','b','c'};
//存储字符为:a,b,c,\0,\0 \0为终止符
char[]={'a','b','c'};
//存储字符为:a,b,c \\无终止符,容易报错,此种写法容易出错
字符串数组初始化:
char ch[5]="abc";//a,b,c,\0,\0
char ch[]="abc";//a,b,c,\0
1. 一维数组在内存中是连续存放的;
2. 随着数组下标的增大,数组的内存地址是从小逐渐增大的。
1.数组的下标是从0开始的;
2.数组的大小可以通过计算得到:
int arr[10];
int sz = sizeof(arr)/sizeof(arr[0]);
二维数组
创建:int arr[3][4];//3行4列
初始化:int arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};//依次逐行逐列填入数值
int arr[3][4]={1,2,3,4};//依次逐行逐列填入数值,不足部分以0补足
int arr[3][4]={{1,2},{3,4},{5,6}};//分行填入内容,每行不足以0补足
int arr[][4]={{1,2},{3,4},{5,6}};//行可以省略,但是列不能
二维数组只是在拓扑上是二维的,在内存中存储时仍然是连续内存存放,故需要限定列的长度。
int arr[][4] = { {1,2},{3,4},{5,6} };
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
}
}
数组作为函数参数
数组传参的时候,传递的其实是数组首元素的地址。
所以一般不能在函数里计算数组元素个数。
下面是错误代码的示例:
Void bubble_sort (int arr[])
{
int sz = sizeof(arr)/sizeof(arr[0]); //4/4 结果为1
}
void main()
{
int arr[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
bubble_sort(arr);
return 0;
}
数组名是数组首元素的地址:
printf("%p\n", &arr[0]);
printf("%p\n", arr);
输出结果:
000000D6BAEFFB18
000000D6BAEFFB18
例外:
1. sizeof(数组名):数组名表示整个数组-计算的是整个数组的大小、单位是字节;
2. &数组名:数组名表示整个数组,取出的是整个数组的地址。