1、数组的用处
为什么要使用数组?
在C语言中,很多时候需要用到很多相同类型的数据,如果把这些数据保存在不同的变量中,那就需要定义很多这样的变量,在这个时候,就可以使用数组,将这些数据放在数组中。
2、数组的声明
数据类型 数组名[元素个数];
如:
int arr1[10]; //声明一个整型数组,可以存放最多10个整型数据
float arr2[5]; //声明一个float数组,可以存放最多5个float数据
char arr3[100]; 声明一个char数组,可以存放最多100个char数据
【注意】如果只是对数组进行声明,必须写明数组的元素个数,如int arr[ ]是错误的。
3、数组的初始化
①int a[5] = {1,2,3,4,5}; //对数组整体赋值
int a[5];
a[5] = {1,2,3,4,5}; //如果声明数组时没有初始化,那么之后就不能对数组进行整体赋值
②int a[ ] = {1,2,3,4,5}; //初始化数组时,元素个数可以省略
③int a[5]= {1,2,3}; //部分初始化,没有赋值的元素的值为0
④int a[5] = {0}; //五个元素值为0
⑤int a[5]; //五个元素值为随机数
可变长数组:
int n;
scanf("%d",&n);
int a[n]; //可变长数组不能再直接初始化,如:int a[n] = {0}是错误的
4、访问数组元素
通过数组名+数组下标进行访问数组元素
数组下标的范围:0~元素个数-1
int arr[5] = {1,2,3,4,5};
arr[2]-->3
arr[4]-->5
arr[5]-->?
【注意】在C/C++中编译器不会对数组做越界检测,所以arr[5]这个写法是可以通过编译的,但是运行结果是未知的,有可能得到一个随机数,也有可能导致程序段错误。
练习:定义一个包含10个整型数据的数组
要求:
①从键盘输入数据对数组赋值
②计算并打印数组元素的最大值,最小值和平均值
字符数组
char str[5] = {'1','2','3','4','5'}; //字符数组
等价于char str[5] = {49,50,51,52,53};
char str[10];
输入:scanf("%s",str);
输出:printf("%s",str);
int arr[5] = {1,2,3,4,5};
【注意】str本身就是一个数组名,等价于首元素的地址,即在一维数组中str ==&str[0];
字符数组可以通过%s连续输入输出,原因是字符数组的每个元素是一个字节,是连续的。
在C语言中,可以用字符数组来表示字符串,字符串用双引号括起来,都是以\0结尾的。
char str[10] = {'1','2','3','4','5'};不等价于char str[10] = "12345";
char str[10] = {'1','2','3','4','5','\0'};等价于char str[10] = "12345";
6、一维数组名
int arr[5]; //arr是数组名
(1)数组名arr表示首元素(arr[0])地址,即:arr ====&arr[0]
(2)&arr是整个数组的地址
163、若有以下定义和语句,则对
m数组元素地址的正确引用是(B)
int m[2][3], (*p)[3] ;p=m;
A、p[2] //&p[2][0]
B、p[0]+1 //&p[0][1];
C、*(p+2) //等价于p[2];
D、(p+1)+2 //&p[3];
7、数组作为函数的参数
方式1:【推荐】
void func(int *arr,int len) //数组作为函数的参数使,一般要额外传数组的长度(除char外)
{
}
方式2:
void func(int arr[10])
{
}
方式3:
void func(int arr[])
{
}
调用:
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
func(arr);
【注意】数组作为函数的参数时,会自动退化为指针。所以int *arr;int arr[10];int arr[];都只占八个字节;
8、数组作为函数的返回值
int* func(void)
{
static int arr[5] = {1,2,3,4,5};
return arr;
}
【注意】函数中不能返回一个局部变量数组,要返回数组,可以在数组声明时加上static
9、二维数组
(1)声明:数据类型 数组名[m][n];
如:int arr[3][2]; //3,表示有3个一维数组,2,表示每个一维数组最多存放2个元素
3个一维数组:arr[0]、arr[1]、arr[2]
6个元素:arr[0][0] arr[0][1] arr[1][0] arr[1][1] arr[2][0] arr[2][1]
(2)初始化
①int arr[3][2] = {1,2,3,4,5,6};
等价于int arr[3][2] = {{1,2},{3,4},{5,6}};
等价于int arr[ ][2] = {{1,2},{3,4},{5,6}};
②int arr[3][2] = {1,2,3};
等价于int arr[3][2] = {{1,2},{3,0},{0,0}};
【注意】二维数组的第一个元素个数可以省略,但是第二个不能省略;
字符二维数组:
char str[3][10] = {"www","baidu","com"};
str[0]--->"www"
str[1]--->"baidu"
str[2]--->"com"
10、二维数组名
int arr[3][2];
arr 二维数组名,地址
arr[0] 第一个一维数组名,地址
arr[0][0] 第一个一维数组的第一个元素
&arr[0] 整个第一个一维数组的地址
&arr[0][0] 第一个一维数组的第一个元素地址
arr ==== &arr[0]
arr[0] ==== &arr[0][0]