【C语言】详解数组

文章目录


前言

一、数组的概念(数组是一组相同类型元素的集合)

二~三、一维数组和二维数组的创建和初始化,以及如何使用数组下标访问和使用数组,还讨论了一维数组和二维数组在内存中是如何存储的


一、数组的概念

数组是一组相同类型元素的集合,展开来讲就是:
• 数组中存放的是1个或者多个数据,但是数组元素个数不能为0。
• 数组中存放的多个数据,类型是相同的。

数组分为一维数组和多维数组,多维数组一般比较多见的是二维数组。

二、一维数组

1.一维数组的创建

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

type arr_name[常量值];

存放在数组中的数据被称为数组的元素,数组在创建的时候要指定数组的大小和数组的元素类型。
• type 指定的是数组中存放数据的类型,可以是: char、short、int、float 等,也可以自定义的类型。
• arr_name 指的是数组的名字,这个名字根据实际情况,起的有意义就行。
• [ ] 中的常量值是用来指定数组的大小的,这个数组的大小根据实际的需求指定就行。

我们可以根据需要创建不同类型和大小的数组:

int age[20];

char ch[8];

double score[10];

2.一维数组的初始化

有时候,数组在创建的时候,我们需要给定一些初始值,这种就称为数组初始化。
那数组如何初始化呢?数组的初始化⼀般使用大括号,将数据放在大括号中。

(1)完全初始化:在定义数组时对全部数组元素赋予初值
    int arr[5] = {1,2,3,4,5}; 

(2)不完全初始化:在定义数组时只给一部分数组元素赋予初值
    int arr[5] = {1,2}; //前两个元素初始化为1和2,剩余的元素默认初始化为0
    char ch[5] = {'a','b'}; //前两个元素初始化为'a'和'b',剩余的元素默认初始化为'\0'

(3)在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。例如:
                int arr[5] = {1,2,3,4,5}; 
     也可以写成:int arr[] = {1,2,3,4,5};  
     //虽然没有在方括号中指定数组的大小,但是系统会根据花括号中数据的个数来确定数组的大小

3. 一维数组的使用

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

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

在C语言中数组的访问提供了⼀个操作符 [ ] ,这个操作符叫:下标引用操作符。
有了下标访问操作符,我们就可以轻松的访问到数组的元素了,比如我们访问下标为7的元素,我们就可以使用 arr[7] ,想要访问下标是3的元素,就可以使用 arr[3]
。如下代码:

c 复制代码
#include <stdio.h>

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("%d\n", arr[7]);//8
	printf("%d\n", arr[3]);//4
	return 0;
}

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

依次打印数组元素的地址:

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

三、二维数组

1.二维数组的创建

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

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

举例说明:

int arr[3][5];

• 3表示数组有3行
• 5表示每⼀行有5个元素
• int 表示数组中的每个元素是整型类型

2. 二维数组的初始化

在创建数组的时候,给定⼀些初始值,被称为数组初始化。
那二维数组如何初始化呢?像一维数组一样,也是使用大括号初始化的。

(1)完全初始化:在定义数组时对全部数组元素赋予初值
    int arr[3][5] = {1,2,3,4,5,2,3,4,5,6,3,4,5,6,7}; //可以将所有数据写在一个花括号内来对数组进行初始化
    int arr[3][5] = {{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}}; //也可以将数据放在几个花括号内分行来对数组进行初始化
(2)不完全初始化:在定义数组时只给一部分数组元素赋予初值
    int arr1[3][5] = {1,2,3,4,5,6}; //前6个元素初始化为1~6,剩余的元素默认初始化为0
    int arr2[3][5] = {{1,2},{3,4},{5,6}}; //初始化了每一行的前两个元素,每一行剩余的元素默认初始化为0
(3)在对二维数组元素赋初值时,可以省略行数,但不能省略列数(每一行的元素个数)。如下:
   int arr1[][5] = {1,2,3,4,5,6};
   int arr2[][5] = {1,2,3,4,5,6,7,8,9,10,11};
   //系统会根据赋初值的元素个数和列数来确定二维数组的行数

3. 二维数组的使用

其实二维数组访问也是使用下标的形式的,二维数组是有行和列的,只要锁定了行和列就能唯⼀锁定数组中的⼀个元素。
C语言规定,二维数组的行是从0开始的,列也是从0开始的,如下所示:

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

行号和列号都是从0开始的,只要确定了行和列就能唯⼀锁定数组中的⼀个元素,比如,我们说:第0行,第0列,快速就能定位出1;第2行,第4列,就能定位出7。 如下代码:

c 复制代码
#include <stdio.h>

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[0][0]);//1
	printf("%d\n", arr[2][4]);//7
	return 0;
}

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

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

c 复制代码
#include <stdio.h>

int main()
{
	int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
	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;
}


从输出的结果来看,每⼀行内部的每个元素都是相邻的,地址之间相差4个字节,跨行位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是差4个字节,所以二维数组中的每个元素都是连续存放的。
如下图所示:


相关推荐
柠檬少少开发1 分钟前
图像拼接算法及实现(一)
人工智能·算法·计算机视觉
晴子呀4 分钟前
Spring底层原理大致脉络
java·后端·spring
只吹45°风10 分钟前
Java-ArrayList和LinkedList区别
java·arraylist·linkedlist·区别
阿华的代码王国17 分钟前
【JavaEE】多线程编程引入——认识Thread类
java·开发语言·数据结构·mysql·java-ee
黑蛋同志18 分钟前
array和linked list的区别
java
andrew_121924 分钟前
腾讯 IEG 游戏前沿技术 一面复盘
java·redis·sql·面试
寻求出路的程序媛32 分钟前
JVM —— 类加载器的分类,双亲委派机制
java·jvm·面试
这孩子叫逆34 分钟前
35. MyBatis中的缓存失效机制是如何工作的?
java·spring·mybatis
骆晨学长34 分钟前
基于SpringBoot的校园失物招领系统
java·spring boot
汇匠源34 分钟前
零工市场小程序:保障灵活就业
java·小程序·零工市场