C语言---数组

一.数组的概念

数组是一组相同类型元素的集合;

1.数组中存放的是一个或者多个数据,但是数组的元素个数不能为0。

2.数组中存放的多个数据,其类型必须是相同的。

3.数组分为一维数组和多维数组。多维数组一般常见的是二维数组。

二.数组的创建

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

type arr_name[20];

存放在数组里的值称为数组的元素。

数组在创建的时候可以指定数组的大小和数组元素的类型。

type ----- 指定的是数组中存放的数据的类型,比如int char short float等等,也可以是自定义类型。

arr_name------是数组的名字,根据实际情况起名,使名字有意义即可。

【常量值】------- 这是用来指定数组的大小的,大小根据实际需求指定即可,二维情况特殊,后面介绍。

例:

int arr[20];

这创建了一个元素类型为整形的可以容纳20个数据的数组。

三.数组的初始化

数组在创建的时候,我们给定一些初始值,这就称为初始化。

初始化分为两种。

//完全初始化,可以不写数组大小
int arr1[3] = {1,2,3};
//不完全初始化
int arr2[3] = {1};//第一个元素为1,其余元素默认为0
//错误的初始化
int arr3[3] = {1,2,3,4,5};//元素个数大于数组的大小

四.数组的类型

数组其实也是有类型的,而数组可以算作一种自定义类型,去掉数组名留下的就是数组的类型。

int  arr1[10];
char arr2[5];
 
//arr1的数组类型就是int [10]
//arr2的数组类型就是cahr [5]

五.一维数组的使用

1.数组的下标

C语言规定数组的元素是有下标的,下标是从0开始的,假设数组有n个元素,第一个元素的下标就是0,第二个元素的下标是1,。。。。,最后一个元素的下标是n-1;

如下:

int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
//index   分别是 0  1  2  3  4  5  6  7  8   9

2.操作符   [ ]

在C语言中数组的访问提供了一个操作符 [ ],这个操作符叫:下标引用操作符

比如:当我们们访问下标为7的元素是1我们就可以使用arr[7];

#include<stdio.h>
int main
{
    int arr[5] = {1,3,5,7,9};
    printf("%d",arr[3]);//5
    return 0;
}

3.数组元素的打印

当我们要访问整个数组的时候我们就可以使用循环,

#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++)
     {
         printf("%d ", arr[i]);
     }
     return 0;
}

输出的结果便是 1 2 3 4 5 6 7 8 9 10

4.数组的输入

明白了数组的访问我们当然也可以给数组输入我们想要的数据,这个可以在初始化的时候进行,也可以利用循环输入

#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++)
     {
         scanf("%d", &arr[i]);
     }
     for(i=0; i<10; i++)
     {
         printf("%d ", arr[i]);
     }
     return 0;
}

5.一维数组和二维数组在内存中的存储

要了解数组在内存中的存储,我们需要打印数组的地址

这时候我们需要用到占位符%p

#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++)
     {
         printf("&arr[%d] = %p\n ", i, &arr[i]);
     }
     return 0;
}

我们可以发现地址是由小到大变化的,并且当我们仔细观察可以发现,每个两个相邻元素之间相差4,为什么呢?

因为一个整形是4个字节。

所以我们可以得出一个结论:数组在内存中是连续存放的。

那二维数组中也是吗???

我们可以试一下

#include <stdio.h>
int main()
{
	int arr[3][3] = { 1,2,3,4,5,6,7,8,9,};
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++) 
		{
			printf(" &arr[%d][%d] = %p         ", i,j, &arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

我们可以发现依然是相差4个字节,甚至是在换到下一行的时候,下一行第一个元素和上一行最后一个元素也相差4,所以⼆维数组中的每个元素都是连续存放的

所以我们在二维数组的创建的时候第二个【】中必须写一个常量值,不然就不知道每一列有多少个元素,也就违反了数组在内存中是连续存放的结论

6.数组中元素个数的计算----sizeof

在C语言中有一个关键可以帮我们计算数组元素的个数

就是  sizeof

作用:sizeof关键字提供与变量或类型(包括聚合类型)相关联的存储量(以字节为单位)。此关键字返回size_t类型的值。

#include <stido.h>
int main()
{
     int arr[10] = {0};
     printf("%d\n", sizeof(arr));
     return 0;
}

这里输出的结果是40,单位是字节,为什么是40呢?因为一个整形是4个字节,所以10个就是40个字节,即数组所占内存空间的总大小。

但是这并不是数组元素的个数,那么到底怎么计算呢?

我们知道数组中所有元素的类型都是相同的,那么我们只需要知道数组的所占内存总大小和数组中一个元素的字节,就能算出来了

sizeof(arr)计算的是数组所占内存的总大小,

sizeof(arr[0])计算的是第一个元素所占内存的大小;

所以sz就是数组的元素个数

六.二维数组的使用

1.二维数组的介绍

前⾯学习的数组被称为⼀维数组,数组的元素都是内置类型的,如果我们把⼀维数组做为数组的元
素,这时候就是⼆维数组,⼆维数组作为数组元素的数组被称为三维数组,⼆维数组以上的数组统称为多维数组。

2.二维数组的创建

	type arr[常量值1][常量值2];

	比如:
	int arr1[3][5];
	char arr2[3][5];

这两个数组中的3都表示数组有三行

                         5都表示数组每一行有五个元素,即五列;

3.二维数组的初始化

初始化分了三种,与一维数组有些不同。

//不完全初始化
int arr1[5][5] = { 1,2,3 };
int arr2[3][3] = { 0 };
//完全初始化
int arr3[3][3] = { 1,2,3 ,4,5,6, 7,8,9 };
//按照行初始化
int arr4[2][3] = { {1,2},{3,4} };

4.行可省,列不省。

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

原因在一维数组在内存中的存储已经讲了,这里不再赘述了。

5.二维数组的下标

二维数组访问也是使用下标的形式。

在C语言中,二维数组的行是从0开始的,列也是从0开始。

如下:

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

最上面一行的数字表示列号,最左边一列的数字表示行号。并且都是从0开始的

比如第三行第五列,就能快速定位到7;即arr[2][4];

6.二维数组的输入和输出

与一维数组类似,

二维数组的输入输出也可以用循环实现

比如:(有兴趣的可以用以下代码试试)

#include <stdio.h>
int main()
{
	int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
	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;
}

七.变长数组

在C99标准之前,C语⾔在创建数组的时候,数组⼤⼩的指定只能使⽤常量、常量表达式,或者如果我
们初始化数据的话,可以省略数组⼤⼩。
1 int arr1[10];
2 int arr2[3+5];
3 int arr3[] = {1,2,3};
这样的语法限制,让我们创建数组就不够灵活,有时候数组⼤了浪费空间,有时候数组⼜⼩了不够⽤的。
C99中给⼀个变⻓数组(variable-length array,简称 VLA)的新特性,允许我们可以使⽤变量指定
数组⼤⼩。
请看下⾯的代码:
int n = a+b;
int arr[n];
上⾯⽰例中,数组 arr 就是变⻓数组,因为它的⻓度取决于变量 n 的值,编译器没法事先确定,只
有运⾏时才能知道 n 是多少。 变⻓数组的根本特征,就是数组⻓度只有运⾏时才能确定,所以变⻓数组不能初始化。它的好处是程序员不必在开发时,随意为数组指定⼀个估计的⻓度,程序可以在运⾏时为数组分配精确的⻓度。有⼀个⽐较迷惑的点,变⻓数组的意思是数组的⼤⼩是可以使⽤变量来指定的,在程序运⾏的时候,根据变量的⼤⼩来指定数组的元素个数,⽽不是说数组的⼤⼩是可变的。数组的⼤⼩⼀旦确定就不能再变化了。
遗憾的是在VS2022上,虽然⽀持⼤部分C99的语法,没有⽀持C99中的变⻓数组,没法测试;下⾯是
#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;
}

我在gcc编译器上测试,可以看⼀下。(可以自己尝试一下)

以上是对数组的讲解,有什么问题可以私信我或者在评论中发出来,

点个赞,丘丘了

资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值