C语言由基础至精通——数组

数组(Array)是C语言中一种自定义类型,用于存储一组相同类型元素的集合。

一、数组的概念

数组是一组相同类型元素的集合,如int a[2]={1,2},就是一个整型数组,大括号{ }内的这组元素均为整型。
特点:

  • 数组中元素个数不能为0,即至少存放一个数据
  • 数组中存放的数据类型均相同

二、一维数组

创建语法数据类型 数组名[数组大小],如 int a[5],即创建了一个整型数组a,其内有5个整型数据元素。

type arr_name[常量值]; // 如 int a[5];  

初始化:即在创建一维数组的同时给定一些初始值,放入大括号{ }中

int a[5] = {1, 2, 3, 4, 5};  // 完全初始化,数组所有元素都给定了初始值

int b[6] = {1};  // 不完全初始化,数组第⼀个元素初始化为1,剩余的元素默认初始化为0 

int c[3] = {1, 2, 3, 4};  // 初始化错误, 超出了定义的数组大小 3

int arr[] = {23, 12, 45, 67};  // 省略数组大小,由初始化值确定数组大小为 4
  • 当数组已经初始化了,则可省略数组的大小,其大小由编译器根据初始化内容确定。如 int arr[ ]={23,12,45,67},这里省略了数组的大小,但可根据初始化内容确定其数组大小为 4
  • C99 标准之前数组的大小只能使用常量,不能使用变量

数据类型:数组是一种自定义类型,去掉数组名留下的即为数组类型

int a[5];
int b[10];
char c[10];  // 数组a的类型为 int [5],数组b的类型为 int [10],数组c的类型为 char [10]

注:数组前面的数据类型声明的是数组内数据元素的类型,如 int a[5],其数组里的元素均为整型,而数组的类型为 int [5]。

一维数组的访问:C语言规定数组有下标,且下标从0开始,通过下标引用操作符 [ ] 即可访问数组内的元素。如,创建一个数组 int arr[] = {23, 12, 45, 67},则arr[0] = 23,访问下标为0的元素;arr[1] = 12,访问下标为1的元素;arr[2] = 45,访问下标为2的元素。

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main() {
	// 输入十个整数,并输出打印至屏幕
	int arr[10] = {0};   // 创建arr数组,大小为 10 ,并都初始化 0
	for (int i = 0; i < 10; i++)
	{
		scanf("%d", &arr[i]);  // 循环输入10个整数
	}
	system("pause");  // 暂停程序
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);  // 按下标从0到9输出数组元素
	}
	printf("\n");

	return 0;
}

数组在内存中的存储:数组在内存中是连续存放的,且地址随下标的增大而由小到大变化

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,10}; 
    int i = 0;
    for(i=0; i<10; i++)
    {
    	// %p,地址占位符
        printf("&arr[%d] = %p\n ", i, &arr[i]);  // 打印数组各元素的地址
    }
    return 0;
}

在这里插入图片描述
sizeof():C语言的关键字之一,用于计算类型或者变量大小,也可计算数组大小,返回值为所占内存空间的总大小,单位为字节(Byte)。

#include <stdio.h>

int main()
{
    // sizeof(),计算类型或变量所占内存的大小,单位为字节
    printf("%d\n", sizeof(char));  // 输出打印 1
    printf("%d\n", sizeof(short)); // 输出打印 2
    printf("%d\n", sizeof(int)); // 输出打印 4
    printf("%d\n", sizeof(long)); // 输出打印 4   C语言规定:sizeof(long)>=sizeof(int)
    printf("%d\n", sizeof(long long)); // 输出打印 8
    printf("%d\n", sizeof(float)); // 输出打印 4
    printf("%d\n", sizeof(double)); // 输出打印 8
    int arr[10]={0};  // 创建数组并初始化
    printf("%d\n", sizeof(arr[0])); // 计算数组第一个元素所占内存大小,输出打印 4
    printf("%d\n", sizeof(arr));  // 计算整个数组所占内存大小,输出打印 40
    // 计算数组元素个数,输出打印 10
	printf("%d\n", sizeof(arr)/sizeof(arr[0]));
    return 0;
}

三、二维数组

概念把⼀维数组作为数组的元素,即为二维数组,同理,将二维数组作为数组的元素,即为三维数组

创建语法数据类型 数组名[行][列],如 int a[3][5],即创建了一个整型二维数组a,其内有3个一维数组(行),每个一维数组(行)有5个整型数据元素(列)。

type arr_name[常量值1][常量值2];  // 如 int a[3][5];  

初始化:即在创建二维数组的同时给定一些初始值,放入大括号{ }中

  • 不完全初始化:程序会从第一行第一列开始初始化,未初始化到的值默认为 0
// 初始化第一行第1,2列位置的元素分别为1,2,其余行、列元素默认为 0
int a1[3][5] = {1,2}; 
// 初始化第一行所有数据和第二行第1,2,3列位置的元素分别为6,7,8,其余行、列元素默认为 0
int a2[3][5] = {1,2,3,4,5,6,7,8}; 
// 初始化第一行前两位数据,第二行前三位数据,第三行前三位数据,其余行、列元素默认为 0
int a3[3][5] = {{1,2},{3,4,5},{6,7,8};
  • 完全初始化:
int b1[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
int b2[3][5] = {{1,2,3,4,5}, {2,3,4,5,6}, {3,4,5,6,7}};
  • 初始化时,行可省略,列不能省略,其行数由编译器根据初始化内容确定
int c1[][5] = {1,2,3};  // 一行
int c2[][5] = {1,2,3,4,5,6,7};  // 两行
int c3[][5] = {{1,2}, {3,4}, {5,6}}; // 三行

二维数组的访问:C语言规定二维数组的行和列下标均是从0开始,通过下标引用操作符 [ ] 即可访问二维数组内的元素。如,创建一个二维数组 int arr[2][3] = {{23, 12, 45}, {67}},则arr[0][0] = 23,访问第一行第一列的元素,即行、列下标均为 0 的元素;arr[1][2] = 0,访问第二行第三列的元素,即行下标为 1,列下标为 3 的元素,此时的元素值初始化默认为0

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
	// 二维数组的输入与输出
    int arr[3][5] = {{1,1}, {2,2,2}, {3,3,3,3}};
    printf("%d\n", arr[1][3]);  // 访问第二行第四个元素,输出结果: 0
    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 <stdio.h>

int main()
{
    int arr[2][3] = { 0 };
    int i = 0;
    int j = 0;
    for (i = 0; i < 2; i++)
    {
        for (j = 0; j < 3; j++)
        {
        	// %p,地址占位符
            printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
        }
    }
    
    return 0;
}

在这里插入图片描述

四、C99标准中的变长数组

C99标准之前,C语言创建数组的时候,数组大小的指定只能使用常量、常量表达式,或者在初始化数据的时候,可以省略数组大小。

int a1[10];
int a2[3+5];
int a3[] = {1,2,3};

这种创建数组的方式,不够灵活,有时候就会出现数组大了浪费空间,数组小了又不够用。于是,在C99标准中,就引入了变长数组的概念,允许数组的大小可以是变量
注:

  • VS虽然支持了C99语法,但不是全部支持,比如,变长数组在VS上是不支持的
  • 变长数组不能初始化

在gcc编译器上的测试:

#include <stdio.h>

int main()
{
    int n = 0;
    scanf("%d", &n); // 根据输⼊数值确定数组的⼤⼩ 
    int arr[n];
    int i = 0;
    for (i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    for (i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

五、代码练习

一、输入三个整数,按从小到大输出。

二、在屏幕上输出 9*9 乘法口诀表。

三、打印100~200之间的素数。

四、求10个整数中最大值。

五、计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,并打印结果。

六、编写程序数一下1~100的所有整数中出现多少个数字9。

七、编写一个程序,从用户输入中读取10个整数并存储在一个数组中。然后,计算并输出这些整数的平均值。

参考代码:https://gitee.com/zuiltd/c-language/commit/0c3b04a35cac520dcf1e7afe6a4ad1755fb5ae7a

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值