C语言中的数组详解

C语言中的数组

  • 数组
    • 概念
  • 一维数组
    • 数组的创建
    • 数组的初始化
    • 数组的类型
  • 一维数组的使用
    • 数组下标
    • 数组元素的打印
    • 数组的输入
  • 一维数组在内存中的存储
  • sizeof 计算数组元素个数
  • 二维数组
    • 概念
    • 创建
    • 初始化
      • 不完全初始化
      • 完全初始化
      • 按照行初始化
      • 初始化可省略行,但是不能省略列
  • 二维数组的使用
    • 二维数组的下标
    • 二维数组的输入和输出
  • 二维数组在内存中的存储
  • C99中的变长数组

数组

概念

  • 数组是一组相同类型元素的集合
    • 数组中存放的是1个或者多个数据,但是数组元素个数不能为0。
    • 数组中存放的多个数据,类型是相同的
  • 数组分为一维数组和多维数组,多维数组一般比较多见的是二维数组。

一维数组

数组的创建

type arr_name[常量值]
  • 数组在创建的时候可以指定数组的大小数组的元素类型
    • type 指定的是数组中存放数据的类型,可以是: char、short、int、float等,也可以自定义的类型。
    • arr_name 指的是数组名的名字
    • [] 中的常量值是用来指定数组的大小的。
      • //存储某个班级的20个人的数学成绩
        int math[20]
        

数组的初始化

数组的初始化一般使用大括号,将数据放在大括号中。

//完全初始化
int arr[5] = {1, 2, 3, 4, 5};

//不完全初始化
int arr[5] = {1};//第一个元素初始化为1,剩余的元素默认初始化为0

数组的类型

  • 去掉数组名留下的就是数组的类型
int arr[10]	//类型:int [10]
int arr[5]	//类型:int [5]      

一维数组的使用

数组下标

  • 假设数组有 n 个元素,第一个元素的下标是 0 ,最后一个元素的下标是 n-1。
  • 在C语言中数组的访问提供了一个操作符 [] ,这个操作符叫:下标引用操作符
  • 我们访问下标为7的元素,我们就可以使用 arr[7] ,想要访问下标是3的元素,就可以使用arr[3] ,如下代码:
    • #include 
      int main()
      {
          int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
          printf("%d\n", arr[7]);//8
          printf("%d\n", arr[3]);//4
          return 0;
      }
      

数组元素的打印

#include 
int main()
{
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int i = 0;
    for(i = 0; i < 10; i++)
    {
        printf("%d\n", arr[i]);
    }
    return 0;
}

数组的输入

#include 
int main()
{
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        scanf("%d", &arr[i]);
    }
    for(i = 0; i < 10; i++)
    {
        printf("%d\n", arr[i]);
    }
    return 0;
}

一维数组在内存中的存储

#include 
int main()
{
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int i = 0;
    for(i = 0; i < 10; i++)
    {
        printf("&arr[%d] = %p\n", i, &arr[i]);
    }
    return 0;
}

//输出结果
//&arr[0] = 0133F8D0
//&arr[1] = 0133F8D4
//&arr[2] = 0133F8D8
//&arr[3] = 0133F8DC
//&arr[4] = 0133F8E0
//&arr[5] = 0133F8E4
//&arr[6] = 0133F8E8
//&arr[7] = 0133F8EC
//&arr[8] = 0133F8F0
//&arr[9] = 0133F8F4
  • %p 打印地址
  • 数组随着下标的增长,地址是由小到大变化的,并且每两个相邻的元素之间相差4(因为一个整型是4个字节)。
  • 数组在内存中是连续存放的

sizeof 计算数组元素个数

  • sizeof 后面如果是变量数组,则可省略括号,是类型则不可
#include 
int main()
{
    int arr[10] = { 0 };
    printf("%d\n", sizeof arr);
    return 0;
}
// 输出的结果是40,计算的是数组所占内存空间的总大小,单位是字节。
  • 数组中所有元素的类型都是相同的
#include 
    int main()
    {
        int arr[10] = {0};
        printf("%d\n", sizeof arr[0]);	//计算一个元素的大小,单位是字节
        return 0;
    }
  • 计算数组的元素个数
#include 
int main()
{
    int arr[10] = { 0 };
    int sz = sizeof(arr) / sizeof(arr[0]);  //计算的是数组的元素个数
    printf("%d\n", sz);
    return 0;
}	
//结果是10,表示数组有10个元素

二维数组

概念

  • 数组的元素都是内置类型的,如果我们把一维数组做为数组的元素,这时候就是二维数组,
  • 二维数组作为数组元素的数组被称为三维数组,
  • 二维数组以上的数组统称为多维数组。

创建

type arr_name[常量值1][常量值2]int arr[3][5]
  • 3表示数组有3行
  • 5表示每一行有5个元素
  • int 表示数组的每个元素是整型类型
  • arr 是数组名,可以根据自己的需要指定名字

初始化

不完全初始化

int arr1[3][5] = {1, 2};
int arr2[3][5] = {0};

完全初始化

int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};

按照行初始化

int arr4[3][5] = {{1,2},{3,4},{5,6}};

初始化可省略行,但是不能省略列

int arr5[][5] = {1,2,3};
int arr6[][5] = {1,2,3,4,5,6,7};
int arr7[][5] = {{1,2}, {3,4}, {5,6}};

二维数组的使用

二维数组的下标

C语言规定,二维数组的行是从0开始的,列也是从0开始的:

int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
#include 
int main()
{
    int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
    printf("%d\n", arr[2][4]);
    return 0;
}//输出7

二维数组的输入和输出

#include 
int main()
{
    int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
    int i = 0;//遍历行
    //输入
    for(i=0; i<3; i++)//产生行号
    {
        int j = 0;
        for(j = 0; j < 5; j++)//产生列号
        {
            scanf("%d", &arr[i][j]);//输入数据
        }
    }
    //输出
    for(i=0; i<3; i++)//产生行号
    {
        int j = 0;
        for(j = 0; j < 5; j++)//产生列号
        {
            printf("%d ", arr[i][j]);//输出数据
        }
        printf("\n");
    }
    return 0;
}

二维数组在内存中的存储

#include 
int main()
{
    int arr[3][5] = { 0 };
    int i = 0;
    int j = 0;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 5; j++)
        {
            printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
        }
    }
    return 0;
}
//&arr[0][0] = 00CFF860
//&arr[0][1] = 00CFF864
//&arr[0][2] = 00CFF868
//&arr[0][3] = 00CFF86C
//&arr[0][4] = 00CFF870
//&arr[1][0] = 00CFF874
//&arr[1][0] = 00CFF878
//&arr[1][1] = 00CFF87C
//&arr[1][2] = 00CFF880
//&arr[1][3] = 00CFF884
//&arr[1][4] = 00CFF888
//&arr[2][1] = 00CFF88C
//&arr[2][2] = 00CFF890
//&arr[2][3] = 00CFF894
//&arr[2][4] = 00CFF898
  • 每一行内部的每个元素都是相邻的,地址之间相差4个字节,跨行位置处的两个元素(如:arr[0][4]arr[1][4] )之间也是差4个字节,所以二维数组中的每个元素都是连续存放的

C99中的变长数组

  • 允许我们可以使用变量指定数组大小。
int n = a + b;
int arr[n];
  • 数组 arr 是变长数组,长度取决于变量的值,只有运行时才能知道 n 是多少。
  • 变长数组的根本特征,就是数组长度只有运行时才能确定,所以变长数组不能初始化
  • 变长数组的意思是数组的大小是可以使用变量来指定的
  • 数组的大小一旦确定就不能再变化了。

你可能感兴趣的:(C语言学习记录,c语言,算法,数据结构)