从零开始学C语言系列之第八章《数组》

往期回顾

1.【第一章】《认识C语言》
2.【第二章】C语言概述及基本知识1
3.【第二章】C语言概述及基本知识2
4.【第三章】字符串和格式化输入/ 输出
5.【第三章】 printf
6.【第三章】 scanf
7.【第三章】 putchar
8.【第三章】 getchar
9.【第三章】 sizeof
10.【第三章】 strlen
11.【第三章】 define
12.【第四章】运算符第一节
13.【第四章】运算符第二节
14.【第四章】运算符第三节
15.【第四章】运算符第四节
16.【第四章】类型转换
17.【第四章】函数与转化
18.【第五章】while
19.【第五章】for开篇
20.【第五章】for的灵活性
21.【第五章】逗号运算符
22.【第五章】do while
23.【第五章】循环选择
24.【第六章】if
25.【第六章】else if
26.【第六章】break
27.【第六章】continue
28.【第六章】break和continue的区别与作用
28.【第六章】switch
29.【第七章】函数复习
30.【第七章】函数参数
31.【第七章】函数中返回值
32.【第七章】递归
33.【第七章】指针引入
34.【第七章】指针简介
35.【第七章】指针简介2



数组回顾

​   前面介绍过,数组由数据类型相同的一系列元素组成。需要使用数组时,通过声明数组告诉编译器数组中内含多少元素和这些元素的类型。编译器根据这些信息正确地创建数组。

简单来说:

  • 数组:类型相同的数据元素的集合,是C语言中的一种构造数据类型。
  • 这些元素会顺序地存储在内存的某段区域。
  • 普通变量可以使用的类型,数组元素也都可以用

例如:

/*一些数组声明*/
int main(void)
{
	float candy[365];	/*内含365个float 类型元素的数组*/
	char code[12];		/*内含 12 个char 类型元素的数组*/
	int states[50];		/*内含50 个int 类型元素的数组*/
}

方括号([])表明candy、code和states 都是数组,方括号中的数字表明数组中的元素个数。

​   要访问数组中的元素,通过使用数组下标数(也称为索引)表示数组中的各元素。数组元素的编号从0开始,所以 candy[0]表示 candy 数组的第1个元素,candy[364]表示第 365 个元素,也就是最后一个元素

初始化数组

初始化数组介绍

#include <stdio.h>
#define MONTHS 12

int main(void)
{
    int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31};
    .........
}

​   如上所示,用以逗号分隔的值列表(用花括号括起来)来初始化数组,各值之间用逗号分隔。在逗号和值之间可以使用空格

​   根据上面的初始化,把31赋给数组的首元素(days[0]),以此类推.

int a[1] = {1};
int ab[2] = {1,2};
int abc[3] = {1,2,3};

再比如:

#include <stdio.h>
#define MONTHS 12

int main(void)
{
    int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31};
    int index;
    
    for (index = 0; index < MONTHS; index++)
        printf("Month %d has %2d days.\n", index +1,days[index]);
    
    return 0;
}

在这里插入图片描述
使用数组前必须先初始化它与普通变量类似,在使用数组元素之前,必须先给它们赋初值

​   如果不对数组进行初始化,则编译器使用的值是内存相应位置上的现有值,每台机器上运行该程序后的输出会与该示例不同。

部分初始化

#include <stdio.h>
#define SIZE 4
int main(void)
{
    int some_data[SIZE] = {1492, 1066};
    int i;
    
    printf("%2s%14s\n","i", "some_data[i]");
    for (i = 0; i < SIZE; i++)
        printf("%2d%14d\n", i, some_data[i]);
    return 0;
}

在这里插入图片描述

如上所示,当初始化列表中的值少于数组元素个数时,编译器会把剩余的元素都初始化为0

​   也就是说,如果不初始化数组,数组元素和未初始化的普通变量一样,其中储存的都是垃圾值.但是,如果部分初始化数组,剩余的元素就会被初始化为0。
​   如果初始化列表的项数多于数组元素个数,编译器可没那么仁慈,它会毫不留情地将其视为错误。

​    注意,这点性质非常重要,当我们以后如果使用数组的时候,却不知道要给他初始化什么值时,我们可以这样做

// 这样这20个元素初始化的值都被赋予零,可以方便我们后期修改
char aa[20]={0};

自动匹配数组

我们目前使用编译器自动匹配数组大小和初始化列表中的项数

#include <stdio.h>
int main(void)
{
    const int days[] = {31,28,31,30,31,30,31,31,30,31};
    int index;
    
    for (index = 0; index < sizeof days / sizeof days[0]; index++)
        printf("Month %2d has %d days.\n", index +1,days[index]);
    
    return 0;
}

在这里插入图片描述
  
如果初始化数组时省略方括号中的数字,编译器会根据初始化列表中的项数来确定数组的大小。

​   注意 for 循环中的测试条件。由于人工计算容易出错,所以让计算机来计算数组的大小。sizeof运算符给出它的运算对象的大小(以字节为单位)。所以sizeof days 是整个数组的大小(以字节为单位),sizeof day[0]是数组中一个元素的大小(以字节为单位)。整个数组的大小除以单个元素的大小就是数组元素的个数。

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值