一起学习C语言:数组(一)

  上一章 <一起学习C语言:C语言循环结构> 系列内容中,我们了解了循环结构的用法和适用场景,以及循环结构结合continue语句、break语句的处理方式。本章节,我们学习数组用法。


章节预览:


数组
1. 一维数组的声明
2. 一维数组的初始化赋值与使用
3. 一维字符类型数组使用
目录预览

章节内容:


数组

  在C语言中,某一数据类型拥有多个必要的数据,并且需要多个对象存储时,可以通过数组形式进行存储。数组对象与基本类型对象有些不同,数组对象储存的是数组首地址。

  比如 int a = 1, b = 2, c = 3, d = 4,定义成数组形式为int a[4] = {1, 2, 3, 4};


  【例6.1】 使用数组保存int值1、2、3、4并输出值对应的内存地址。

      int a[4] = {1, 2, 3, 4};
      printf(“a->地址:%p, a[0]->值:%d 地址:%p, a[1]->值:%d 地址:%p, a[2]->值:%d 地址:%p, a[3]->值:%d 地址:%p.\n”, a, a[0], &(a[0]), a[1], &(a[1]), a[2], &(a[2]), a[3], &(a[3]));


    示例结果

在这里插入图片描述

6-1 示例结果

        图6-1,程序通过a[0]、a[1]、a[2]、a[3],输出数字1、2、3、4, 可以理解为它们是数组的第一个成员值、第二个成员值、第三个成员值、第四个成员值。并通过&(a[0]),&(a[1]),&(a[2]),&(a[3]),输出第一个成员地址、第二个成员地址、第三个成员地址、第四个成员地址。


    示例分析

int类型数组成员 a[3] a[2] a[1] a[0]
对应值 4 3 2 1
对应地址 0x0136F808 0x0136F804 0x0136F800 0x0136F7FC
6-2 数组int a[4] = {1, 2, 3, 4};

        图6-2,从数组成员a[0]、a[1]、a[2]、a[3]的地址中,可以分析出数组中的地址是连续的,它们从低地址到高地址按类型字节长度分出数据区域。另外,从示例结果中,可以分析出数组的首地址与数组第一个成员的地址相同。


1. 一维数组的声明

  一维数组属于一个具有固定大小,元素类型相同的顺序集合。一维数组通过指定元素类型 (1)、变量名、元素个数 (2),完成使用前的声明。

  一维数组的声明形式

      元素类型 变量名[元素个数];

  一维数组的声明举例

      int a[5];
      char a[5];
      float a[5];


  (1):元素类型,即数据类型,比如int、char、float等。

  (2):元素个数表示数组的成员数量,数组成员从下标0 (3) 开始,即[0],表示数组的第一个成员。元素个数是大于0的常量整数,比如1、4 + 1,也可以是大于0的宏常量整数。

  (3):下标表示数组中的成员标识,即数组下标。比如a[5],它的下标范围在0-4,可以通过指定下标数字,访问数组成员a[0]、a[1]、a[2]、a[3]、a[4]的数据。


2. 一维数组的初始化赋值与使用

  数组声明时进行初始化赋值,是一个良好的编码习惯,程序调试过程中,可以轻松分析出数组中的有效数据,程序实际运行中,也可以避免因未赋值数据造成的多余执行。

  一维数组初始化赋值

      int a[5] = {1}; //只为第一个成员赋值为1,其余的成员自动赋值为0
      int a[5] = {0}; //只为第一个成员赋值为0,其余的成员自动赋值为0,这种方式可以看做数组中的所有成员值清零
      int a[5] = {1,2,3,4,5}; //为所有成员赋值


  【例6.2】 声明一个元素个数为5的int数组,并为第一个成员赋值为1。当数组中的成员值为0时,退出数组遍历执行。

    【方式1】 首先声明不初始化赋值的数组,编写这个示例:

        int a[5];
        int cycle = sizeof(a) / sizeof(int);

        a[0] = 1;
        for (int i = 0;i < cycle;i++) {
            if (a[i] != 0)
                printf(“执行%d次,成员值为:%d.\n”, i + 1, a[i]);
            else
                break;
        }


        示例结果

            执行1次,成员值为:1.
            执行2次,成员值为:-858993460.
            执行3次,成员值为:-858993460.
            执行4次,成员值为:-858993460.
            执行5次,成员值为:-858993460.


    【方式2】 声明初始化赋值的数组,编写这个示例:

        int a[5] = {1};
        int cycle = sizeof(a) / sizeof(int);

        for (int i = 0;i < cycle;i++) {
            if (a[i] != 0)
                printf(“执行%d次,成员值为:%d.\n”, i + 1, a[i]);
            else
                break;
        }


        示例结果

            执行1次,成员值为:1.


    程序分析

        1. 数组元素个数可以通过sizeof(数组对象) / sizeof(数组类型)运算得到,这种形式属于动态运算形式。
        2. 【方式1】 需要判断所有数组成员,才能停止数组的遍历,【方式2】 只需要判断有效数据即可。


3. 一维字符类型数组使用

  字符类型数组一般用作固定长度的字符存储或类似字符串存储/输出,它们之间的存储格式有些不同。

  一维字符类型数组字符存储

      char a[5] = {‘a’,‘b’,‘c’,‘d’,‘e’};
      char b = a[1];
      a[1] = 0;

      字符存储:通过数组下标,访问或修改数组中的指定成员值。


  一维字符类型数组字符串存储

      char a[] = “abcde”; 或 char a[] = {“abcde”}; //形式一 不指定元素个数
      char a[6] = “abcde”; 或 char a[6] = {“abcde”}; //形式二 指定元素个数
      char *b = a;
      memcpy(a, “12345”, strlen(“12345”));

      字符串存储:通过数组地址,访问或修改数组中的多个成员值。


  字符串存储格式有三个必要条件

      1. 一段连续的有效字符中,成员值不能为‘\0’(或十进制数字0) (4)
      2. 一段连续的有效字符应以‘\0’为结尾。
      3. 字符数组的元素个数大于一段连续的有效字符个数。比如“abcde”占5个字符,字符数组的元素个数至少为6,并且数组的第六个成员值为‘\0’。


  (4):‘\0’是一个转义字符,一般表示字符串结束标志。转义字符以\或者\x开头,只能由八进制或者十六进制编码值表示,\表示八进制形式的编码值,\x表示十六进制形式的编码值。字符也可以直接由十进制数字表示,比如‘\0’写成0。


  【例6.3】 使用字符数组储存“Hello World”并输出信息,然后为字符数组赋值“你好”并输出信息。

      char a[] = “Hello World”;
      printf(“a:%s.\n”, a);

      if (sizeof(a) / sizeof(char) > strlen(“你好”)) {
          memset(a, 0, sizeof(a));
          memcpy(a, “你好”, strlen(“你好”));
          printf(“a:%s.\n”, a);
      }


    示例结果

        a:Hello World.
        a:你好.


    程序分析

        1. 首先为字符数组对象a初始化赋值"Hello World",然后输出这条语句。
        2. 判断对象a的元素个数是否大于字符串“你好”的字节数。
        3. 为对象a的所有成员赋值为0,即‘\0’。
        4. 为对象a赋值“你好”,然后输出这条语句。


    strlen函数:通常用来获取一段字符长度。如果一段字符中包含 ‘\0’字符,返回‘\0’之前的长度,否则返回一段字符的字节长度。另外,如果一段字符不是以‘\0’字符为结尾,将会得到一个错误的长度(数据访问越界得到一个超出实际字节的长度)。

    memset函数:通常用作一段内存赋值,它只能设定一个int类型赋值参数,在这里我们用它为结构体初始化赋值为0。

    memcpy函数:通常用作一段内存赋值,它可以设定一段连续的内存赋值参数。

  在后续“API部分常用函数解析”章节中,详细介绍这些函数的用法和实现方式。


目录预览

<一起学习C语言:C语言发展历程以及定制学习计划>
<一起学习C语言:初步进入编程世界(一)>
<一起学习C语言:初步进入编程世界(二)>
<一起学习C语言:初步进入编程世界(三)>
<一起学习C语言:C语言数据类型(一)>
<一起学习C语言:C语言数据类型(二)>
<一起学习C语言:C语言数据类型(三)>
<一起学习C语言:C语言基本语法(一)>
<一起学习C语言:C语言基本语法(二)>
<一起学习C语言:C语言基本语法(三)>
<一起学习C语言:C语言基本语法(四)>
<一起学习C语言:C语言基本语法(五)>
<一起学习C语言:C语言循环结构(一)>
<一起学习C语言:C语言循环结构(二)>
<一起学习C语言:C语言循环结构(三)>

发布了111 篇原创文章 · 获赞 720 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/a29562268/article/details/105329393