C语言数组详解:从概念到内存存储
C语言数组详解:从概念到内存存储
数组是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]
。
#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.一维数组在内存中的存储
依次打印数组元素的地址:
#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。
#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.二维数组在内存中的存储
像一维数组一样,我们如果想研究二维数组在内存中的存储方式,也是可以打印出数组所有元素的地址的。代码如下:
#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个字节,所以二维数组中的每个元素都是连续存放的。