C语言 —— 浮生百态 生灭有时 - 数组

发布于:2025-02-19 ⋅ 阅读:(23) ⋅ 点赞:(0)

目录

1. 数组的概念

2. ⼀维数组的创建和初始化

2.1 数组创建

2.2 数组的初始化

2.3 数组的类型

3. ⼀维数组的使用

3.1 数组下标的访问

4. ⼀维数组在内存中的存储

5. ⼆维数组的概念

5.1 ⼆维数组的创建

5.2 ⼆维数组的初始化

6. ⼆维数组的使用

6.1 ⼆维数组的下标

6.2 二维数组的存储

7. C99中的变长数组


1. 数组的概念

数组是⼀组相同类型元素的集合;从这个概念中我们就可以发现2个有价值的信息:

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

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

   
3. 数组分为⼀维数组和多维数组,多维数组⼀般⽐较多⻅的是⼆维数组

   

4. 数组可以没有初始值和大小


2. ⼀维数组的创建和初始化

2.1 数组创建

   
⼀维数组语法形式:

type arr_name[常量值];

int arr[20] = {0};

存放在数组的值被称为数组的元素,数组在创建的时候可以指定数组的大小和数组的元素类型

type 指定的是数组中存放数据的类型,如: char、short、int、float 等,也可以自定义类型
arr_name 指的是数组名的名字,这个名字根据实际情况,起的有意义就行
[] 中的常量值是用来指定数组的大小的,这个数组的大小是根据实际的需求指定就行
int math[20];

char ch[8];

double score[10];

2.2 数组的初始化

将数据放在大括号中就是数组的初始化

//完全初始化
int arr[5] = { 1,2,3,4,5 };

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

//错误的初始化 - 初始化项太多
int arr3[3] = { 1, 2, 3, 4 };

2.3 数组的类型
 

数组也是有类型的,数组算是⼀种自定义类型,去掉数组名留下的就是数组的类型

int arr1[10];

int arr2[12];

char ch[5];

arr1数组的类型是 int [10]        arr2数组的类型是 int[12]        ch 数组的类型是 char [5]

 


 

3. ⼀维数组的使用

我们知道,⼀维数组可以存放数据,存放数据的目的是对数据的操作,那么我们应该如何使用呢?

3.1 数组下标的访问

C语言规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后⼀个元素的下标是n-1,下标就相当于数组元素的编号

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

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

   
有了下标访问操作符,我们就可以轻松的访问到数组的元素了

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//访问下标为2的元素
	printf("%d\n", arr[2]);
	//访问下标为3的元素
	printf("%d\n", arr[3]);
	return 0;
}

访问整个数组的内容

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;
}


4. ⼀维数组在内存中的存储

依次打印数组元素的地址

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个字节),所以我们得出结论:数组在内存中是连续存放的


5. ⼆维数组的概念

 

我们把⼀维数组做为数组的元素,这时候就是⼆维数组,⼆维数组作为数组元素的数组被称为三维数组,⼆维数组以上的数组统称为多维数组

5.1 ⼆维数组的创建

二维数组语法形式:

   

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

例如:
int arr[3][5];
double data[2][8];

3表⽰数组有3⾏
5表⽰每⼀⾏有5个元素
int 表⽰数组的每个元素是整型类型
arr 是数组名,可以根据⾃⼰的需要指定名字
data数组意思基本⼀致。

5.2 ⼆维数组的初始化

⼆维数组的初始化和⼀维数组⼀样,也是使⽤⼤括号初始化的

不完全初始化

int arr1[3][5] = {1,2};
int arr2[3][5] = {0};

完全初始化

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

 

2345为第一行,23456为第二行,34567为第三行

初始化时可以省略行,但是不能省略列

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

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

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


6. ⼆维数组的使用


6.1 ⼆维数组的下标

⼆维数组的访问也是使⽤下标的形式的,⼆维数组是有⾏和列的,只要锁定了⾏和列就能唯⼀锁定数组中的⼀个元素

    
C语⾔规定,⼆维数组的⾏是从0开始的,列也是从0开始的

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

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

	printf("%d\n", arr[2][4]);
	printf("%d\n", arr[2][2]);
	printf("%d\n", arr[1][4]);

	return 0;
}

 


 打印整个二维数组
   

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;
}

6.2 二维数组的存储

像一维数组⼀样,我们如果想研究⼆维数组在内存中的存储方式,我们也是可以打印出数组所有元素的地址

int main()
{
	int arr[3][5] = { 0 };
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 5; j++)
		{
			printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
		}
	}
	return 0;
}

和一维数组一样,⼆维数组中的每个元素也是连续存放的


7. C99中的变长数组

在C99标准之前,C语⾔在创建数组的时候,数组⼤⼩的指定只能使⽤常量、常量表达式,或者如果我们初始化数据的话,可以省略数组大小

比如:

int arr1[10];
int arr2[3+5];
int arr3[] = {1,2,3};

这样的语法限制,让我们创建数组就不够灵活,有时候数组⼤了浪费空间,有时候数组⼜⼩了不够用的

C99中给⼀个变⻓数组(VLA)的新特性,允许我们可以使⽤变量指定数组大小,如:

   

int n = a+b;
int arr[n];

数组 arr 就是变长数组,它的长度取决于变量 n 的值,编译器无法事先确定,只有运行时才能知道n是多少

   

变长数组的根本特征,就是数组长度只有运行时才能确定,所以变长数组不能初始化


完结撒花~


网站公告

今日签到

点亮在社区的每一天
去签到