[C语言]之数组的使用

目录

 一: 一维数组

1.1 数组的创建

1.2 数组如何初始化?

1.3数组的使用

1.4 数组在内存中的存储

二 : 二维数组

2.1 2维数组的创建和初始化

2.2 2维数组的使用

2.3 2维数组在内存中的存储

三. 数组的越界

四. 数组作为函数参数

五.接下来,我们使用数组完成冒泡排序!!


什么是数组?

数组是一组相同类型的元素的集合,

int arr[ ] = { }; 为一维数组 int arr[ ][ ] = { }; 为二维数组,当然也有三维数组,使用较少;

 一: 一维数组

1.1 数组的创建

type_t arr_name [const_n];
//type是类型 arr 是 数组名 const是常量 
//注:[ ] 在c99之前 里面必须是常量 c99之后 支持了变长数组的概念。

//如何正确的创建数组?
int arr1[10];
//代码2
int count = 10;
int arr2[count];这里[]内不是常量
//代码3
char arr3[10];
float arr4[1];
double arr5[20];

1.2 数组如何初始化?

int arr1[10] = {1,2,3};
//int 类型 arr1数组名 [10]数组有十个元素 {1,2,3}初始化有123,其余为0
int arr2[] = {1,2,3,4};
//int 类型 arr1数组名 [ ]数组元素未初始化 {1,2,3,4}初始化有1234,[]内此时被{}内的个数初始为4
int arr3[5] = {1,2,3,4,5};
char arr4[3] = {'a',98, 'c'};
char arr5[] = {'a','b','c'};
char arr6[] = "abcdef";

1.3数组的使用

数组是通过下标来访问的,小标从0开始;

数组的大小可以通过计算得到;

#include <stdio.h>
int main()
{
    int arr[10] = {0};//数组的不完全初始化
//计算数组的元素个数
    int sz = sizeof(arr)/sizeof(arr[0]);
//对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以:
    int i = 0;//做下标
    for(i=0; i<10; i++)
    {
        arr[i] = i;
    }
//输出数组的内容
    for(i=0; i<10; ++i)
    {
        printf("%d ", arr[i]);
    }
return 0;
}

1.4 数组在内存中的存储

要查看如何存储可以看数组的地址

 可以看出数组在内存中是连续存储的,由低地址到高地址;

二 : 二维数组

2.1 2维数组的创建和初始化

int arr[3][4];
char arr[3][5];
double arr[2][4];
//数组初始化
int arr[3][4] = {1,2,3,4};
int arr[3][4] = {{1,2},{4,5}};
int arr[][4] = {{2,3},{4,5}};
//二维数组如果有初始化,行可以省略,列不能省略

2.2 2维数组的使用

//二维数组也是通过下标访问的
#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("%d ", arr[i][j]);
        }
    }
    return 0;
}

2.3 2维数组在内存中的存储

通过结果我们可以分析到,其实二维数组在内存中也是连续存储的。
 

三. 数组的越界

数组是通过下标访问的,如果超过了下标就是越界访问。

如果数组有n个元素,下标就有n-1个,访问n时就已经越界。

C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的,所以程序员写代码时,最好自己做越界的检查。

四. 数组作为函数参数

数组在使用时,单独的数组名,默认为首元素地址。

但有2种情况列外

**一种是sizeof(数组名)单独放数组名时是整个数组 这时数组名代表整个数组  。

**一种是 & 数组名 ,取出的是数组的地址 这时数组名代表整个数组。

五.接下来,我们使用数组完成冒泡排序!!

引用网络gif图展示过程

 1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.每趟从第一对相邻元素开始,对每一对相邻元素作同样的工作,直到最后一对。
3.针对所有的元素重复以上的步骤,除了已排序过的元素(每趟排序后的最后一个元素),直到没有任何一对数字需要比较。

 代码展示