c语言成长之路9

124 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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。所以,当数组需要传参,并且还需要用到数组的元素个数时,要先计算好数组元素个数,将计算好的元素个数和数组一起传参。