数组是一类相同元素的集合。
一、一维数组
1、数组的创建
type_t arr_name [const_n];
//type_t 是指数组的元素类型
//const_n 是一个常量表达式,用来指定数组的大小,即元素个数
例如:
int arr1[10];
char arr2[30];
float arr3[33];
2、数组的初始化
数组的初始化是指在创建数组同时给数组内容一些合理初始值
int x=10;//初始化
int x; x=10;//赋值
定义变量步骤: 开辟空间和放入初始值,同时进行,叫初始化,分开完成叫赋值
例如:
int a[10]={1,2,3};//给a[0],a[1],a[2]按顺序初始化,其他的未初始化的系统默认为0;
int b[]={1,2,3,4};//没有指定数组大小,系统会根据初始化中的元素个数来定,此数组有4个元素
char c[3]={'a',98,'c'};//此数组为char型,则元素98代表的是ASCLL码表中的字符‘b’.
char d1[]={'a','b','c'};//数组大小为3
char d2[]={'a','b','c','\0'};//数组大小为4;
char e[]="abc"//数组大小为4,因为字符串自带‘\0’,
注:int a[10]={1,2,3}; a={4,5,6};这两句语句不能实现。
数组在创建时如果不想指定数组的大小,就必须初始化,
3、一维数组的使用
数组的 [ ] 下标引用操作符,就是数组访问的操作符
例如:
求数组的大小
数组是使用下标访问的,下标从0开始
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[10] = { 1, 2, 3, 4, 5, 6, 7 };//不完全初始化
int len = sizeof(arr) / sizeof(arr[0]);//求数组元素个数。在哪儿创建的数组在哪儿求大小。
//int 型---4个字节----10个元素共40个字节----40/4=10个元素
int i = 0;
for (i = 0; i < len; i++)
{
arr[i] = i;//除了初始化以外,数组的赋值只能通过遍历一个一个的赋值
printf("arr[%d]=%d\n", i, i);
}
for (i = 0; i < len; i++)
{
printf("arr[%d]=%d\n", i, i);//数组的输出只能通过遍历数组输出。
}
printf("%d",len);
return 0;
}
输出数组的地址
数组的地址是一次性分配的,由低地址到高地址的分配且连续。
int arr[10]={0};中arr代表数组arr的首地址,也就是arr[0]的地址。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[10] = { 1, 2, 3, 4, 5, 6, 7 };
int len = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < len; i++)
{
printf("arr[%d]=%p\n", i, &arr[i]);//%p是用于专门输出地址的字符
return 0;
}
二、二维数组
可以将二维数组看作是由一维数组构成
可以将n维数组看作是由多个(n-1)维数组构成
例如:
int arr[3][4]={{1,2,3,4},{1,2,3,4},{,1,2,3,4}};
1、二维数组的创建
数据类型 数组名 [ 常量1][常量2]
例如:
int arr1[10][10]={0};
char arr2[ ][10]={0};
2、数组的初始化
例如:
int arr1[3][4]={1,2,3,4};//意味着1 2 3 4 0 0 0 0 0 0 0 0
int arr2[3][4]={{1,2},{3,4}};//意味着1 2 0 0 3 4 0 0 0 0 0 0
int arr3[ ][5]={{2,3},{4,5}};//意味着2 3 0 0 4 5 0 0 ,二维数组最多可以不填第一个[ ]的内容,多维数组也是这样,其他的[ ]都不可空着,
int row=sizeof(arr1)/sizeof(arr1[0]);//计算的是行数;
3、二维数组的使用
输出数组及其地址
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[3][4]= {0};
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
arr[i][j] = i * 4 + j;
}
}
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("arr[%d][%d] =%d\n",i,j,arr[i][j]);
}
}
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("Dress---arr[%d][%d] =%p\n", i, j, arr[i][j]);
}
return 0;
}
三、数组传参
数组传参时会降低维度,会降维为只想其内部怨怒类型的指针。
数组作为函数参数时不会把整个数组传过去。
实际上只是把数组的首地址传过去了,所以即使在函数参数部分写成数组的形式:int arr[ ]表示的依然是一个指针:int* arr;
数组传参,如果函数内部需要知道数组元素个数,应该在函数外部算出元素个数,以参数的形式传递给函数。
例如:
求数组长度
❌错误求法
下面的程序结果为1
因为传入函数的是数组的首地址,也就是一个整型指针,整型指针大小为4个字节,arr[0]是一个整数,大小也为4,4/4=1;
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Len(int arr[])
{
int len=sizeof(arr) / sizeof(arr[0]);
return len;
}
int main()
{
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
printf("len=%d\n", Len(arr));
return 0;
}
✔正确求法
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int len=sizeof(arr) / sizeof(arr[0]);
printf("len=%d\n", len);
return 0;
}
如果函数有需要,则将其作为函数参数传入即可。