C语言自学《五》

Wesley13
• 阅读 507

###什么是数组

数组是一组数目固定、类型相同的数据项 数组中的数据称为元素 比如 long numbers[10]; 方括号中的数字定义了要存放在数组中的元素个数,称为数组维度 数组有一个类型,它组合了元素的类型和数组中的元素个数,因此如果两个数组的元素个数、类型相同,这两个数组的类型就相同 可以在数组名称后的方括号内使用索引值,索引值是从0开始的连续整数,例如numbers[0]代表numbers数组的第1个元素

###指定数组索引值

有两种方法指定数组索引值,以访问数组中的某个元素 第一种:使用一个简单的整数,明确指定要访问的元素,例如numbers[4] 第二种:使用计算表达式,计算的结果必须是整数,并且必须在数组中是有效的索引值,例如:numbers[i+3]

如果使用了一个无效的索引值,编译器不会检查出错误,但是执行时会有问题,有可能会提取一个垃圾值,也有比这更糟的,程序可能会覆盖重要的信息,且锁死计算机,需要重启计算机

###使用数组 使用数组计算平均分:

<!-- lang: cpp -->

int main(void) {
    
    int grades[10];
    unsigned int count = 10;
    long sum = 0L;
    float average = 0.0f;

    printf("\nEnter the 10 grades:\n");

    for(unsigned int i = 0; i < count; ++i) {
        
        printf("%2u> ", i + 1);    //提示用户输出10次
        scanf("%d",&grades[i]);    //遍历10次,每次为数组赋值,并求和
        sum += grades[i];
    }
    average = (float)sum / count;    //用求和数除以10次,求出平均数,保留小数点后2为
    printf("\nAverage of the ten grades entered is: %.2f\n", average);
    return 0;
}

###寻址运算符&

寻址运算符&输出其操作数的内存地址,它广泛用于scanf()函数 把它放在变量名的前面,scanf()函数就可以利用这个变量的地址,将键盘输入的数据存入变量 只把变量放入函数的参数,函数就可以使用变量存储的值 而把寻址运算符&放在变量名称前面,函数就可以利用这个变量的地址修改这个变量中存储的值

代码示例:

<!-- lang: cpp -->

#include <stdio.h>

//以下代码的作用是输出一些变量的地址,和所占用的字节数
//得到什么地址值取决于所使用的操作系统及编译器分配内存的方式
int main(void) {
    
    long a = 1L;
    long b = 2L;
    long c = 3L;

    double d = 4.0;
    double e = 5.0;
    double f = 6.0;
    
    //使用%u显示sizeof生成的值,因为sizeof()生成的结果是无符号的整数
    //使用%p输出变量的地址,输出一个内存地址,其值为十六进制
    //内存地址一般是32位或64位,地址的大小决定了可以用的最大内存量
    printf("A variable of type long occupies %u bytes.", sizeof(long));
    printf("\nHere are the addresses of some variables of type long:");
    printf("\nThe address of a is: %p The address of b is: %p", &a, &b);
    printf("\nThe address of c is: %p", &c);
    printf("\n\nA variable of type double occupies %u bytes.", sizeof(double));
    printf("\nThe address of d is: %p The address of e is: %p", &d, &e);
    printf("\nThe address of f is: %p\n", &f);
    return 0;

}

输出结果:

A variable of type long occupies 4 bytes. Here are the addresses of some variables of type long: The address of a is: 0012ff84 The address of b is: 0012ff80 The address of c is: 0012ff7c A variable of type double occupies 8 bytes. The address of d is: 0012ff70 The address of e is: 0012ff68 The address of f is: 0012ff60

###数组的初始化

例如: double values[5] = {1.5,2.5,3.5,4.5,5.5}; 这个语句声明了一个包含5个元素的数组value,values[0]的初值是1.5 初值的个数应该等于数组的维度,如果小于数组的维度,会自动初始化为0 也可以不提供维度,直接初始化数组,由编译器自动推断出元素的个数

###确定数组的大小

使用sizeof运算符可以计算出指定类型的变量所占用的字节数 sizeof运算符生成size_t类型的值,该类型取决于实现代码,一般是无符号的整数类型 如果给输出使用%u说明符,编译器又把size_t定义为unsigned类型,编译器就可能发出警告 %u说明符不匹配printf()函数输出的值,所以使用%zu会消除该警告消息 sizeof运算符也可以用于数组,如下面的示例

代码示例:

<!-- lang: cpp -->

double values[5] = {1.5,2.5,3.5,4.5,5.5};
//使用sizeof运算符输出上面数组所占的字节数
//sizeof运算符引用于变量时不需要使用括号,但一般还是使用括号
printf("The size of the array, values, is %zu bytes.\n", sizeof values);        //8*5 = 40 bytes

//也可以用sizeof运算符计算数组中元素的数目
size_t element_count = sizeof(values) / sizeof(values[0]);    // 40 / 8 = 5

//算出个数后,很方便应用于for循环遍历数组
for(unsigned int i = 0; i < element_count; ++i) {
    printf("values[%u] = %.2lf\n", i,values[i]);
}

###多维数组

多维数组可以看成是数组的数组,也可以按表格来理解 例如: float numbers[3][5]; 这二维数组维float类型,它拥有3行5列 行数的计算:二维数组总字节数 / 一行的总字节数 = 行数 列数的计算:一行的总字节数 / 某个元素的字节数(也就是某行中某列的元素的字节数)= 列数

代码示例:

<!-- lang: cpp -->

    int main(void) {
    
    //初始化二维数组
    int numbers[3][2] = {
                        {1,2},
                        {3,4},
                        {5,6}
                       };
    //计算二维数组行数
    size_t numbers_row = sizeof(numbers) / sizeof(numbers[0]);
    size_t numbers_column = sizeof(numbers[0]) / sizeof(numbers[0][0]);    
    printf("numbers[0]=%zu\n",sizeof numbers[0]);    //输出第一行的字节数
    printf("numbers[0][0]=%zu\n", sizeof numbers[0][0]);    //输出第第一行第一列的字节数
    printf("row=%zu\n", numbers_row);        //输出行数
    printf("column=%zu\n", numbers_column);    //输出列数
    
    for(unsigned int i = 0; i < numbers_row; ++i) {
        for(unsigned int j = 0; j < numbers_column; ++j){
            printf("numbers[%u][%u] = %d\t", i,j,numbers[i][j]);    //输出某行中的列
        }
            printf("\n");    //一行结束,换行
    }
    return 0;
}
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
2年前
PTA1
11数组定义中,数组名后是用方括号括起来的常量表达式,不能用圆括号。(1分)\T\F12在C语言中能逐个地使用下标变量,也能一次引用整个数组。(1分)T\F\因为它有首地址13同一个数组中的每个元素都具有相同的数据类型,有统一的标识符即数组名,用不同的序号即下标来区分数组中的各元素。(1分)\T\F14数
Wesley13 Wesley13
2年前
Go 定长的数组
1.Go语言数组的简介  几乎所有的计算机语言都有数组,应用非常的广泛。同样,在Go语言中也有数组并且在数组的基础上还衍生出了切片(slice)。数组是一系列同一类型数据的集合,数组中包含的每个数据被称为数组元素,一个数组包含的元素个数被称为数组的长度,这是数组的基本定义。  在Go语言中数组是一个值类型(ValueType)
Wesley13 Wesley13
2年前
Java中的数组(Array)
数组对于每一门编程语言来讲都是最重要的数据结构之一,当然不同的编程语言对数组的实现以及处理也不尽相同。数组的概念:把有限个相同类型元素变量放在一个整体,这个整体就叫做数组。数组中的每一个元素被称为数组元素,通常可以通过数组元素的索引(也叫下标,可以理解为一种编号,从0开始)来访问数组元素,包括数组元素的赋值(set)和取值(get)。
Wesley13 Wesley13
2年前
JAVA 基础3
一.数组的概念数组可以看成是多个数据类型的集合,是对这些数据进行统一的管理;数组的变量是引用类型,数组本身是对象,数组中的每个元素相当于该对象的成员变量;数组的元素可以是任何数据类型,包括基础数据类型和引用类型;二.数组的声明方式数据类型\\数组名称new数据类型
Stella981 Stella981
2年前
JavaScript遍历循环
定义一个数组和对象constarr'a','b','c','d','e','f';constobj{a:1,b:2,c:3,d:4}for()经常用来遍历数组元素遍历值为数组元素索引f
Wesley13 Wesley13
2年前
JavaSE
DAY081.数组1.1定义数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。数组的三个基本特点:1.长度是确定的。数组一旦被创建,它的大小就是不可以改变的。2.其元素必须
Stella981 Stella981
2年前
Javascript数组系列一之栈与队列
所谓数组(英语:Array),是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。---百度百科简单理解,数组就是数据的有序列表。Array在Javascript中属于最常用的数据类型之一了,与其它语言一样Javascript中的数
Wesley13 Wesley13
2年前
C#图解教程 第十二章 数组
数组数组数组实际上是由一个变量名称表示的一组同类型的数据元素。每个元素通过变量名称和一个或多个方括号中的索引来访问:数组名索引↓↓MyArray4定义让我们从C中与数组有关的重要定义开始元素数组的独立数据项称为元素。数组的所有元素必须
Wesley13 Wesley13
2年前
Java基础语法:数组
一、简介描述:数组是相同类型数据的有序集合。其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。基本特点:1.数组的长度是确定的。数组一旦被创建,它的大小就是不可以改变的。2.数组元素必须是相同类型,不允许
Wesley13 Wesley13
2年前
Java基础学习总结(21)——数组
一.数组的基本概念数组可以看成是多个相同类型数据组合,对这些数据的统一管理。数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组的元素可以是任何数据类型,包括基本类型和引用类型。C和C中的数组都可以分配在栈上面,而JAVA中的数组是只能分配在堆