C语言数组从入门到精通

1.基本概念:

数组:是C语言里面一种基本的数据结构,它允许你在一片连续性的空间内存储多个相同数据类型的数据。

  • 数组是一种构造数据类型(由多个基本数据类型或者是构造数据类型组成)。
  • 数组空间必须连续
  • 存储多个数据
  • 存储数据类型必须相同

2.数组的定义格式

数据类型 数组名[容量] = {初始化赋值};

分析:

  • 数据类型:约束后续数组里面存储数据的数据类型
  • 数组名:数组名称,约定俗成,见名知意,动宾结构
    • 数组名是一个地址,这个地址是数组中首元素的首地址
  • 容量:约束数组中存储相同数据类型数据的个数
    • 拓展:后续对数组中元素进行访问,是通过数组名+下标的形式
        • 下标:就是数组中第几个元素,下标就为几,数组中元素从0开始,到 容量-1 结束
        • 访问: 数组名[下标]
    • 数组容量,一旦确定,无法修改
  • 数组的空间是连续性的
  • 初始化赋值:给数组中每一个元素进行初始化赋值,所以用{ }括起来

#include <stdio.h>

int main(int argc, char const *argv[])
{
    /*
     数组的类型:int,约束数组中只能存int
     数组名:arr,保存的是数组中首元素的首地址
     数组容量:10,可以存10个int类型的数据
     所以数组下标:0~9
     */
    int arr[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
    printf("arr[4] = %d\n",arr[4]);

    return 0;
}

3.数组相关使用案例

数组打印

#include <stdio.h>

int main(int argc, char const *argv[])
{
   
    int arr[5] = {10, 20, 30, 40, 50};
    printf("arr数组所占字节%lu\n",sizeof(arr));

    printf("arr[0] = %d\n",arr[0]);
    printf("arr[1] = %d\n",arr[1]);
    printf("arr[2] = %d\n",arr[2]);
    printf("arr[3] = %d\n",arr[3]);
    printf("arr[4] = %d\n",arr[4]);
 
    // printf("arr[5] = %d\n",arr[5]); 野值

    char ch[5] = {'h','e','l','l','o'};
    printf("ch数组所占字节%lu\n",sizeof(ch));
    printf("ch[0] = %c\n",ch[0]);
    printf("ch[1] = %c\n",ch[1]);
    printf("ch[2] = %c\n",ch[2]);
    printf("ch[3] = %c\n",ch[3]);
    printf("ch[4] = %c\n",ch[4]);

    char str[6] = "hello";
    printf("str数组所占字节%lu\n",sizeof(str));
    printf("str[0] = %c\n",str[0]);
    printf("str[1] = %c\n",str[1]);
    printf("str[2] = %c\n",str[2]);
    printf("str[3] = %c\n",str[3]);
    printf("str[4] = %c\n",str[4]);
    printf("str[5] = %c\n",str[5]);


    return 0;
}

数组元素长度:

初始化:

初始化相关: 
int arr[5] = {0, 0, 0, 0, 0}; 
int arr2[5] = {0};
int arr3[] = {0, 0, 0, 0, 0}; 
int arr4[5] = {[2]=3};//将arr4[2] = 3,其余为0

4.for循环与数组

天生一对,因为数组下标从0开始,到capacity-1结束,每两个元素下标差值为1

与for循环的起始、终止、步进语句一一对应。

#include <stdio.h>
#include <string.h>

int main(int argc, char const *argv[])
{

    int arr[5] = {10, 20, 30, 40, 50};
    int capacity = sizeof(arr)/sizeof(arr[0]);
    for (int i = 0; i < capacity; i++)
    {
       printf("arr[%d] = %d\n",i,arr[i]);
    }
}

5.数组作为函数的参数(前瞻)

前言:之前提到过,想通过函数来修改参数的值,需要传地址。数组名,本身是一个地址

举例:请你封装一个函数,用户提供一个容量为5的数组,函数执行完毕后,数组里面的元素依次被赋值为10,20,30,40,50

分析:

  • 返回值:不需要返回值,只需要函数执行完毕后数组里面的每个元素值改变。
  • 函数名:SetArr
  • 函数参数:
    • 数组名:函数需要修改的数组的名字
    • 容量:修改的元素个数
  • 返回值:无

void SetArr(int arr[],int capacity);

#include <stdio.h>

/**
 * 函数功能:对用户提供的数组进行赋值
 *
 * @param arr[]  数组名,是一个地址
 *
 * @param capacity 数组容量
 *
 * @return 无
 */
void SetArr(int arr[], int capacity);

/**
 * 函数功能:对用户提供的数组进行展示
 *
 * @param arr[]  数组名,是一个地址
 *
 * @param capacity 数组容量
 *
 * @return 无
 */
void ShowArr(int arr[], int capacity);

int main(int argc, char const *argv[])
{
    int arr[5] = {0};
    int capacity = sizeof(arr) / sizeof(arr[0]);
    SetArr(arr, capacity);
    ShowArr(arr, capacity);
    return 0;
}

void SetArr(int arr[], int capacity)

{
    for (int i = 0; i < capacity; i++)
    {
        arr[i] = (i + 1) * 10;
    }
}

void ShowArr(int arr[], int capacity)
{
    for (int i = 0; i < capacity; i++)
    {
        printf("arr[%d]= %d ", i, arr[i]);
    }
    printf("\n");
}

6.数组相关的算法(数据的处理)

增 删 改 查(略过)

排序算法:(列举两个)

6.1:冒泡排序:

例如:int arr[5] = {3,5,1,4,2};

#include<stdio.h>

int main(int argc, char const *argv[])
{
    int arr[5] = {1,2,3,4,5};  //从小到大排序

    int count = 0;

    printf("交换前\n");
    for (int i = 0; i < 5; i++)
    {
        printf("%d ",arr[i]);
    }
   
    for (int i = 0; i < 5; i++)  //外层循环  控制循环次数
    {
        int flag = 0;
        
        for (int j = 0; j < 5-1-i; j++)
        {
            if (arr[j]>arr[j+1])
            {
                int temp = arr[j];
                arr[j] =arr[j+1];
                arr[j+1] = temp;
                flag = 1;
            }
            count++;
        }  
        if (flag == 0)
        {
           break;
        }
        
    }
    printf("\n交换后:\n");
    for (int i = 0; i < 5; i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");
    printf("count:%d\n",count);
    
    return 0;
}

6.2选择排序

int arr[5] = {3,5,4,1,2},从小到大排

代码案例:

#include<stdio.h>
int main(int argc, char const *argv[])
{
    int arr[5] = {3,5,4,1,2};
    printf("排序前的数组数据:\n");
    for (int i = 0; i < 5; i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");

    for (int i = 0; i < 5; i++)  //外层循环 控制第几次遍历
    {
        int min = i;
        for (int j = min+1; j < 5; j++)  //找到剩下元素中最小的那一个
        {
            if (arr[min] > arr[j])
            {
               min = j;
            } 
        }
        if (min!=i) //如果不在应该在的位置,交换过去
        {
            int temp =arr[min];
            arr[min] = arr[i];
            arr[i] = temp;
        }
    }
    
    printf("排序后的数组数据:\n");
    for (int i = 0; i < 5; i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n"); 
    return 0;
}