数组详解(初步认识数组)

本文详细介绍了C语言中的一维数组、二维数组和变长数组的概念、创建与初始化方法,以及它们在内存中的存储方式。特别关注了数组下标、元素访问、输入与打印,以及sizeof操作符的应用。
摘要由CSDN通过智能技术生成

知识点总览: 

目录

数组

一维数组

一维数组的创建和初始化

一维数组的使用

一维数组在内存中的存储

sizeof计算数组元素个数

二维数组

二维数组的创建

二维数组的初始化

二维数组的使用

二维数组在内存中的存储

变长数组


数组

概念:数组是一种用来存储相同类型的元素序列的数据结构。它是一组相同类型的变量的集合,这些变量在内存中是连续排列的。每个数组元素都有一个唯一的索引,可以用来访问该元素。

一维数组

一维数组的创建和初始化

一维数组创建的基本语法:

type arr_name [常量值]

type:指的时数据类型 如int char....等内置类型。 也可以是自定义类型.

arr_name:自己定义 符合实际意义就行

 []内一定要是常量值 不能是变量 如下面这种创建数组是不允许的
 

int main()
{
    int n=0;
    int arr[n];

    return 0;
}

由于n是变量,会产生语法错误 

一维数组的初始化:

不完全初始化:

数组进行不完全初始化,这意味着只初始化数组的一部分元素,而其他元素则保持未初始化状态。这种情况下,未初始化的元素会自动被设置为0(对于数字类型)或者空字符(对于字符数组)。

代码实例:

完全初始化: 

数组进行完全初始化,意味着数组将会初始化数组的全部元素。花括号中的元素个数需要与数组的元素个数相匹配。如果为匹配要么出现数组的越界访问 要么是不完全初始化。

代码示例:

int main()
{
    int arr[5]={1,2,3,4,5};

    return 0;
}

一维数组的使用

1.数组下标

数组的下标(也称为索引)用于访问数组中的元素。数组的下标从0开始,因此第一个元素的下标为0,第二个元素的下标为1,以此类推。

例如,如果有一个名为arr的整型数组,要访问第三个元素,可以使用下标为2,因为数组的下标是从0开始的。

int arr[5] = {10, 20, 30, 40, 50};
int thirdElement = arr[2]; // 访问第三个元素,下标为2

在上面的代码中,arr[2]表示数组arr中的第三个元素,它的值为30。

需要注意的是,数组下标应该是非负整数,且不能超出数组的范围。如果使用超出范围的下标访问数组,将会导致未定义的行为,可能会访问到未知的内存区域,这可能导致程序崩溃或者产生不可预测的结果。

2.数组元素打印

通过循环遍历的方式进行打印,就是通过数组的下标对数组中的每一个元素进行访问.

代码实例:

3.数组的输入

数组的输入同样是通过循环遍历的方式进行。

一维数组在内存中的存储

一维数组在内存中是连续存储的,即数组中的元素在内存中是相邻存储的,依次排列在一起。数组的存储顺序是按照元素的顺序来排列的,即第一个元素存储在数组的起始位置,第二个元素存储在第一个元素的后面,依此类推。下面我们通过地址进行观察

代码示例:

输出结果:

000000772EEFF7F8
000000772EEFF7FC       地址是以16进制进行打印的 
000000772EEFF800        我们不难发现每个地址相差4
000000772EEFF804        4代表的是4字节也就是int类型的大小
000000772EEFF808 

通过地址我们可以发现 地址的跳越是与数组所存的元素类型有关.

sizeof计算数组元素个数

sizeof的作用:

是一个在C语言中非常重要的操作符,用于计算数据类型或变量所占内存的大小(以字节为单位)。它可以用于任何数据类型、变量或表达式。

代码示例:

arr数组所存元素类型为整型,整型所占内存大小为4字节,该数组能存5个整型,所以该数组所占内存大小为20字节

通过上面对sizeof的基本用处有所了解,我们就可以通过sizeof来进行计算数组元素个数:

代码示例:

在这个例子中,sizeof(arr) 计算出数组arr的总大小,sizeof(arr[0]) 计算出数组中第一个元素的大小(这个大小和整型的大小相同),然后将数组的总大小除以单个元素的大小,得到数组中元素的个数。

需要注意的是,这种方法要求数组已经被定义,因为只有在数组已经定义后,sizeof(arr) 才能正确地计算数组的总大小。

二维数组

二维数组是C语言中的一种数据结构,它是由一组行和列组成的矩阵形式的数组。每个元素由两个索引值确定,一个用于指定行,另一个用于指定列。二维数组中的每一行都是一个一维数组。

二维数组的创建

声明数组:首先,需要声明一个二维数组,指定数组的行数和列数,以及数组元素的数据类型。

二维数组声明的基本语法: 

type arr_name[rows][cols];

其中,type 是数组中元素的数据类型,arr 是数组的名称,rowscols 分别是数组的行数和列数。  

二维数组的初始化

不完全初始化:

int arr[5][5]={0};

剩下未初始化的位置,自动用整型0补齐

完全初始化:

int arr[2][2]={1,2,3,4};

因为该数组是两行两列,说明该数组一共用四个整型元素则可以将其完全初始化 

元素是将每行放满后  在将剩余的元素放入下一行

该数组中的元素分布可以直观的将其看成:

第一行   1   2
第二行   3   4

 按照行进行初始化:

代码通过{}进行每行的分隔,不会在上面一样,一次将元素放入数组中 

 代码示例:

观察右边的调试窗口,我们可以发下1,2放入第一行,第一行中第三列没有值放入,系统将其自动初始化为0,下面几行亦是如此。 

注:二维数组定义是列是必须给定常量值,但行是可以不给常量值的

如:

int arr[][]={0};//这样编译器会报错
int arr[][5]={0};//这样编译器不会报错

因为行可以通过给定的元素个数进行推断。但是不给列系统不知道你要在第一行放入多少元素

则会报错. 

二维数组的使用

下标:

二维数组的下标包含两个部分,分别用于指定行和列。下标的基本用法如下:

arr[row][column]

其中,arr是二维数组的名称,row 是行索引,column 是列索引。行索引和列索引都是从0开始的整数,用于指定二维数组中的特定元素。

例如,对于一个名为 matrix 的二维数组,要访问第二行第三列的元素,可以使用下面的语法:

int element = matrix[1][2];

二维数组的输入与打印:

代码示例:

//二维数组的输入
int main()
{
	int arr[5][5];

	int row = 0;//控制行
	int column = 0;//控制列

	printf("请输入你需要打印的值:\n");
	for (row = 0; row < 5; row++)//外层循环控制行
	{		
		for (column = 0; column < 5; column++)//内层循环控制每列 每行的每个元素都可以接收到
		{
			scanf("%d", &arr[row][column]);
		}
	}

	//打印同理 取到数组所有元素即可
	printf("该数组中的元素为:\n");
	for (row = 0; row < 5; row++)
	{
		for (column = 0; column < 5; column++)
		{
			printf("%d ", arr[row][column]);
		}
		printf("\n");//打印完每行换行
	}

	return 0;
}

输出结果:

请输入你需要打印的值:
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
该数组中的元素为:
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5

注:输入的格式不需要按照每行进行输入,全部输入在同一行也可以得到相同的结果 

 二维数组在内存中的存储:

int arr[3][3]={0};

 我们直观的认为该数组中的元素分布是:

下面我们通过观察其地址了解其分布:

不难发下其还是连续的 应该是这样进行分布:

 

每个数组元素都按顺序存储在内存中,第一行的元素按顺序存储在前面,然后是第二行的元素。因此,数组的存储顺序是按行存储的,每一行的元素是连续的。 

变长数组

C99标准引入了变长数组(Variable Length Arrays,VLA),允许在运行时动态指定数组的大小。这与传统的C语言中,数组的大小必须是编译时确定的方式不同。

使用变长数组,可以更灵活地处理需要动态大小的数组,例如需要根据用户输入来确定数组大小的情况。

注:1.数组长度只有在运行时才能确定,所以变长数组不能初始化!!

       2.vs2022不支持该特性,只有在gcc编译器上可以进行测试,使用dev c++可以进行测试

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值