开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情
C 数组
什么是数组呢?数组顾名思义
数组是一种用来存储同一种类型的集合,是一种有序的线性结构表。并且数组元素的地址是连续的。数组最大的优点就是支持随机访问,当想访问数组的某个数时,只需要找到数组的对应下标就可以直接找到该数组对应元素。但是数组也有相应的缺点,那就是数组的元素个数和数组空间大小在创建时就已经被固定死了,如果数组的空间没有使用完也会造成空间浪费,并且因为数组的地址是连续的,这本应该是一个优点的,但是这导致数组在进行删除或增加元素时需要O(n) 才能完成。
一维数组
逐个初始化数组,也可以使用一个初始化语句。
double x[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
大括号 { } 之间的值的数目不能大于我们在数组声明时在方括号 [ ] 中指定的元素数目。
省略掉了数组的大小,数组的大小则为初始化时元素的个数
double x[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
数组是一种一次申请多个变量的方法,数组的使用让我们可以在程序中保留多个变量的值,进行处理,例如给定n个学生的成绩,要求有多少学生超过了平均分,代码如下:
#include <stdio.h> //导如输入输出头文件
int main(){
//主函数
int cj[100]={0};//定义数组
int n;
int count=0;//定义计数器,统计有多少人达到平均分
scanf("%d",&n);
int i=0;
//读入数据
for(i=0;i<n;i++){
scanf("%d",&cj[i]);
}
//对数据进行求和
double sum=0;
for(i=0;i<n;i++){
sum+=cj[i];
}
//求平均分
double arg=sum/n;
//判断有多少人达到平均分;
for(i=0;i<n;i++){
if(cj[i]>arg){
count++;
}
}
//输出平均分和人数
printf("平均分为:%0.2f\n超过平均分的人有:%d个\n",arg,count);
return 0;
}
二维数组
二维数组在我们的逻辑概念中可以是一个矩阵,但在内存中与一维数组一样是一个连续的地址空间。二维数组的创建和初始化
二维数组与一维数组只是多加了一个方括号。数据类型 + 数组名元素个数;
int arr3 = {1,2,3,4}; int arr3 = {{1,2,3}, {4,5,6}, {7,8,9}}; int arr = {0};//二维数组可以不初始化行,但必须初始化列
二维数组的赋值
给二维数组赋值,与一维数组一样都需要循环来搞定,但是二维数组需要在一维数组的循环基础上再嵌套一层循环。
int arr[3][3] = {0};
for(int i = 0;i < 3;i++)
{
for(int j = 0;j < 3;j++)
{
scanf("%d",&arr[i][j]);
}
}
数组名
数组名是指向数组首元素地址的指针,即下标为0的元素的地址的指针。上面说,由于数组的地址是连续的,所以当找到数组的首元素就可以找到数组的其他成员。如果用sizeof(数组名) ,这里的数组名代表的是整个数组,计算的是整个数组的大小。再除以sizeof(下标为0的地址) ,就可以得到数组的元素个数。
数组的传参方式
当要将数组作为函数参数进行传参时,需要在函数的传参位置放一个数组名,形参部分就会接收到一个数组的首元素地址的指针,而接收这个指针就也需要同类型的指针。在形参部分,数组可以有两种形式表示,一种是以数组的形式,一种是以指针的形式,两种方式都可以对数组进行传参。
void` `bubble_sort(``int` `arr[])``
void``bubble_sort(``int``* arr)
当数组在传参之后,函数部分是不能计算数组的元素个数的。因为形参接收的只是一个数组的首元素地址的指针,而不是整个数组,计算数组的时候也只是计算了数组的首元素地址的大小,然后再除以首元素地址的大小,所以理所当然的得到一个1。所以,当数组需要传参,并且还需要用到数组的元素个数时,要先计算好数组元素个数,将计算好的元素个数和数组一起传参。