• C语言高级教程-C语言数组(三)



    在这里插入图片描述

    本文的编译环境

    本文的编译环境使用的是集成开发环境:Visual Studio 2019
    在这里插入图片描述

    Visual Studio 2019官网链接如下

    Visual Studio 2019官网链接
    在这里插入图片描述

    Visual Studio 2019集成的开发环境的特点有

    • Visual Studio 2019默认安装Live Share代码协作服务。
    • 帮助用户快速编写代码的新欢迎窗口、改进搜索功能、总体性能改进。
    • Visual Studio IntelliCode AI帮助。
    • 更好的Python虚拟和Conda支持。
    • 以及对包括WinForms和WPF在内的.NET Core 3.0项目支持等 。

    一、前文:C语言数组(一、二)的链接

    1.1、C语言数组一文章链接

    在C语言数组(一)的教程中,简单的介绍了如下的几点

    • 介绍如何在C语言程序中使用数组。
    • 后在编写程序使用数组时,如何通过一个名称来引用一组数值。
    • 通过程序实例来掌握了C语言一维数组的定义,使用方法。

    C语言数组(一)的文章链接如下所示

    文章:C语言数组(一)
    在这里插入图片描述

    1.2、C语言数组二文章链接

    在C语言数组(二)的教程中,简单的介绍了如下的几点

    • 介绍了C语言高级编程的数组的寻址方法。
    • 通过几个实例程序来掌握C语言数组寻址的应用。

    C语言数组(二)的文章链接如下所示

    文章:C语言数组(二)

    在这里插入图片描述

    二、数组的初始化

    2.1、数组的初始化的几种方式

    • 可以给数组的元素指定初值,这可能只是为了安全起见。预先确定数组元素的初始值,更便于查找错误。
    • 为了初始化数组的元素,只需在声明语句中,在大括号中指定一列初值,它们用逗号分开。

    例如:

    	double values[5] = { 1.5, 2.5,3.5, 4.5, 5.5 };
    
    • 1
    • 这个语句声明了一个包含5个元素的数组value。
    • values[0]的初值是 1.5, value[1]的初值是2.5,依此类推。
    • 要初始化整个数组,应使每个元素都有一个值。
    • 如果初值的个数少于元素数,没有初值的元素就设成0。

    因此如果编写

        double values1[5] = { 1.5, 2.5, 3.5 };
    
    • 1
    • 前3个元素用括号内的值初始化,后两个元索初始化为0。
    • 如果没有给元素提供初值,编译器就会给它们提供初值0,所以初值提供了一种把整个数组初始化为0的简单方式。

    只需要给一个元素提供0:

        double values2[5] = { 0.0 };
    
    • 1
    • 整个数组就初始化为0.0。
    • 如果初值的个数超过数组元素的个数,编译器就会报错。

    在指定一列初始值时, 不必提供数组的大小,编译器可以从该列值中推断出元素的个数。

        int primes[] = { 2, 3,5, 7,11, 13, 17, 19,23, 291 };
    
    • 1
    • 上述语句中的数组大小由列表中的初始值个数来确定,所以primes数组有10个元素。

    三、数组和地址

    3.1、数组和地址的关系

    下面声明了一个包含4个元素的数组:

    long number[4];
    
    • 1
    • 数组名称number指定了存储数据项的内存区域地址,把该地址和索引值组合起来就可以找到每个元素,因为索引值表示各个元素与数组开头的偏移量。
    • 声明一个数组时,要给编译器提供为数组分配内存所需的所有信息,包括值的类型
      和数组维,而值的类型决定了每个元素需要的字节数。
    • 数组维指定了元素的个数。
    • 数组占用的字节数是元素个数乘以每个元素的字节数。
    • 数组元素的地址是数组开始的地址,加上元素的索引值乘以数组中每个元索类型所需的字节数。

    如下所示是数组变量保存在内存中的情形。

    数组在内存中 的组织方式

    在这里插入图片描述

    • 获取数组元素地址的方式类似于普通变量。对value 整数变量
    • 可以用以下语句输出它的地址:
        printf("数组value的地址是%p\n", &values);
    
    • 1
    • 要输出number数组的第3个元素的地址,可以编写如下代码:
        printf("\n数组number的第三个元素的地址是%p%p\n\n", &number[2]);
    
    • 1

    3.2、输出数组的地址值

    • 下面的代码段设置了数组中的元素值,然后输出了每个元素的地址和内容。
    int data[5];
    for (unsigned int i=0;i<5; ++i)
    data[i] = 12*(i + 1);
    printf ("data[&d] Address: 易p Contents: d\n", i, &data[i], data[i]) ;
    
    • 1
    • 2
    • 3
    • 4
    • for循环变量i遍历了data数组中的所有合法索引值。
    • 在这个循环中,位于索引位置i上的元素值设置为12*(i+1)。
    • 输出语句显示了当前的元素及其索引值,由i的当前值决定的数组元素的地址,以及存储在元素中的值。

    上面的程序调试结果输出如下

    在这里插入图片描述

    数组value的地址是00CFF814
    
    数组number的第三个元素的地址是00CFF77400491023
    
    数组data[0] 的地址是: 00CFF750, 数组data[0]的数据是: 12
    数组data[1] 的地址是: 00CFF754, 数组data[1]的数据是: 24
    数组data[2] 的地址是: 00CFF758, 数组data[2]的数据是: 36
    数组data[3] 的地址是: 00CFF75C, 数组data[3]的数据是: 48
    数组data[4] 的地址是: 00CFF760, 数组data[4]的数据是: 60
    
    请按任意键继续. . .
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • i 的值显示在数组名后面的括号中。
    • 每个元素的地址都比前一个元素大4,所以每个元素占用4个字节。

    四、确定数组的大小

    4.1、sizeof运算符确定数组的大小

    • sizeof运算符可以计算出指定类型的变量所占用的字节数。
    • 对类型名称应用sizeof运算符。

    如下:

       // 输出字节数
        printf("long类型变量的大小为%zu 字节。\n", sizeof(long));
    
    • 1
    • 2
    • sizeof运算符后类型名称外的括号是必需的。

    • 如果漏了它,代码就不会编译。

    • 也可以对变量应用sizeof运算符,它会计算出该变量所占的字节数。

    • sizeof运算符生成size_ t类型的值,该类型取决于实现代码,一般是无符号的整数类型。

    • 如果给输出使用

    %u
    
    • 1
    • 说明符,编译器又把size_t定义为unsigned long或者unsigned long long,编译器就可能发出警告:使用%u说明符不匹配print()函数输出的值。
    • 使用%u会消除该警告消息。

    4.2、sizeof运算符输出数组所占的字节数

    • sizeof运算符也可以用于数组。下面的语句声明一个数组:
    double values[5] = ( 1.5, 2.53.54.55.5 };
    
    • 1

    可以用下面的语句输出这个数组所占的字节数:

    	// 输出数组字节数
        printf("\n数组values的大小为%zu 字节。\n", sizeof(values));
    
    • 1
    • 2

    调试结果输出如下

    在这里插入图片描述

    数组value的地址是00B3F7B0
    
    数组number的第三个元素的地址是00B3F71000631023
    
    数组data[0] 的地址是: 00B3F6EC, 数组data[0]的数据是: 12
    数组data[1] 的地址是: 00B3F6F0, 数组data[1]的数据是: 24
    数组data[2] 的地址是: 00B3F6F4, 数组data[2]的数据是: 36
    数组data[3] 的地址是: 00B3F6F8, 数组data[3]的数据是: 48
    数组data[4] 的地址是: 00B3F6FC, 数组data[4]的数据是: 60
    
    long类型变量的大小为4 字节。
    
    数组values的大小为40 字节。
    请按任意键继续. . .
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 也可以用表达式
    • sizeof values[0]
    • 计算出数组中一个元素所占的字节数。
    • 这个表达式的值是8。当然,使用元素的合法索引值可以产生相同的结果。
    • 数组占用的内存是单个元素的字节数乘以元素个数。
    • 因此可以用sizeof运算符计算数组中元素的数目:
    	size_t element_count = sizeof values / sizeof values[0];
    
    • 1
    • 执行这条语句后,变量element _count 就含有数组values中元素的数量。
    • element. count声明为size t 类型,因为它是sizeof运算符生成的类型。
    • 可以将sizeof运算符应用于数据类型,所以可以重写先前的语句,计算数组元素的数量。

    如下所示

    	size_t elementCount = sizeof values / sizeof(double);
    
    • 1
    • 这会得到与前面相同的结果,因为数组的类型是double, sizeof(double)会得到元素占用的字节数。
    • 有时偶尔会使用错误的类型,所以最好使用前一条语句。
    • sizeof运算符应用于变量时不需要使用括号,但一般还是使用它们。

    4.3、sizeof运算符运用到for循环中

    前面的例子可以编写为如下所示

    	double values[5] = { 1.5, 2.5,3.5, 4.5, 5.5 };
    	size_t element_count = sizeof values / sizeof values[0];
    	printf("\n数组values的大小为%zu 字节。\n", sizeof(values));
        printf("数组values有 %u 元素, 数组每个元素的字节数是%zu\n", element_count, sizeof(values[0]));
    
    • 1
    • 2
    • 3
    • 4

    这些语句的输出如下

    在这里插入图片描述

    数组value的地址是00EFFC1C
    
    数组number的第三个元素的地址是00EFFB7C00491023
    
    数组data[0] 的地址是: 00EFFB58, 数组data[0]的数据是: 12
    数组data[1] 的地址是: 00EFFB5C, 数组data[1]的数据是: 24
    数组data[2] 的地址是: 00EFFB60, 数组data[2]的数据是: 36
    数组data[3] 的地址是: 00EFFB64, 数组data[3]的数据是: 48
    数组data[4] 的地址是: 00EFFB68, 数组data[4]的数据是: 60
    
    long类型变量的大小为4 字节。
    
    数组values的大小为40 字节。
    
    数组values的大小为40 字节。
    数组values有 5 元素, 数组每个元素的字节数是8
    请按任意键继续. . .
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在使用循环处理数组中的所有元素时,可以使用sizeof 运算符。

    例如:

    	doub1e values[5] = { 1.5, 2.53.54.55.5 };
    	double sum = 0.0;
    	for (int i = 0; i < sizeof(values) / sizeof(values[0]); i++)
        {
            sum += values[i];
        }
        printf("\n数组values中的这些值的和为 %.2f\n\n", sum); 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这些语句的调试结果输出如下

    在这里插入图片描述

    数组value的地址是00D3FE0C
    
    数组number的第三个元素的地址是00D3FD6C00211023
    
    数组data[0] 的地址是: 00D3FD48, 数组data[0]的数据是: 12
    数组data[1] 的地址是: 00D3FD4C, 数组data[1]的数据是: 24
    数组data[2] 的地址是: 00D3FD50, 数组data[2]的数据是: 36
    数组data[3] 的地址是: 00D3FD54, 数组data[3]的数据是: 48
    数组data[4] 的地址是: 00D3FD58, 数组data[4]的数据是: 60
    
    long类型变量的大小为4 字节。
    
    数组values的大小为40 字节。
    
    数组values的大小为40 字节。
    数组values有 5 元素, 数组每个元素的字节数是8
    
    数组values中的这些值的和为 17.50
    
    请按任意键继续. . .
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 这个循环将数组中所有元素的值加起来。
    • 使用sizeof运算符计算数组中的元素个数,可以确保无论数组的大小如何,循环变量i的上限总是正确的。

    五、完整程序

    本文的完整程序如下所示

    5.1 Main.h 文件程序

    #pragma once
    
    #include 
    #include 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    5.2 Main.c 文件程序

    #define _CRT_SECURE_NO_WARNINGS
    
    #include "Main.h"
    
    int main()
    {
        system("color 3E");
    
    
        // 定义数组
        double values[5] = { 1.5, 2.5,3.5, 4.5, 5.5 };
    
    
        double values1[5] = { 1.5, 2.5, 3.5 };
    
    
        double values2[5] = { 0.0 };
    
    
        int primes[] = { 2, 3,5, 7,11, 13, 17, 19,23, 291 };
    
        long number[4];
    
        int data[5];
    
        double sum = 0;
    
        // 数组数组的地址
        printf("数组value的地址是%p\n", &values);
    
        printf("\n数组number的第三个元素的地址是%p%p\n\n", &number[2]);
    
    
        for (unsigned int i = 0; i < 5; ++i)
        {
            data[i] = 12 * (i + 1);
    
            printf("数组data[%d] 的地址是: %p, 数组data[%d]的数据是: %d\n", i, &data[i], i, data[i]);
        }
        printf("\n");
    
        // 输出字节数
        printf("long类型变量的大小为%zu 字节。\n", sizeof(long));
    
        // 输出数组字节数
        printf("\n数组values的大小为%zu 字节。\n", sizeof(values));
    
    
        size_t element_count = sizeof values / sizeof values[0];
    
        size_t elementCount = sizeof values / sizeof(double);
    
    
        /*double values[5] = { 1.5, 2.5,3.5, 4.5, 5.5 };
        size_t element_count = sizeof values / sizeof values[0];*/
        printf("\n数组values的大小为%zu 字节。\n", sizeof(values));
        printf("数组values有 %u 元素, 数组每个元素的字节数是%zu\n", element_count, sizeof(values[0]));
    
    
        for (int i = 0; i < sizeof(values) / sizeof(values[0]); i++)
        {
            sum += values[i];
        }
        printf("\n数组values中的这些值的和为 %.2f\n\n", sum); 
    
        system("pause");
        return 0;
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70

    六、总结

    本文主要介绍了C语言高级编程的数组的初始化的几种方法。
    介绍了数组和地址之间的关系。
    介绍了怎么样确定数组的大小。
    介绍了sizeof怎么样确定数组大小。
    通过实例程序来掌握C语言数组与地址的应用。

    在这里插入图片描述

    本文到这里就结束啦。
    希望本文的C语言数组的初始化、数组和地址、确定数组的大小教程。
    能对你有所帮助。

  • 相关阅读:
    2023年,新手如何玩赚互联网项目?
    app逆向(10)| APP的加固与脱壳
    PAT甲级考试知识点总结和一些看法
    conda环境里安装ffmpeg
    VRP基础及操作
    C语言 拼接字符串
    网页黑白代码将整个网站(包括子页)变为黑白色
    maven基础
    五、构造函数《2022 solidity8.+ 版本教程到实战》
    部署SpringBoot+SpringCloud+Vue项目——半途而废版
  • 原文地址:https://blog.csdn.net/m0_47419053/article/details/126711656