【C语言】数组

目录

一维数组

1.1 一维数组的创建和初始化

1.2 数组的类型

1.3 数组下标

​编辑

1.4 一维数组在内存中的存储

1.5sizeof计算数组元素个数

二、二维数组

2.1 二维数组的初始化

不完全初始化

完全初始化

2.2   二维数组的下标

2.3 ⼆维数组的输入和输出

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

三、C99中的变长数组


数组是⼀组相同类型元素的集合;从这个概念中我们就可以发现2个有价值的信息:
数组中存放的是1个或者多个数据,但是数组元素个数不能为0。
数组中存放的多个数据,类型是相同的。

一维数组

1.1 一维数组的创建和初始化

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

type arr_name[常量值];
存放在数组的值被称为数组的元素,数组在创建的时候可以指定 数组的大小 数组的元素 类型。
type 指定的是数组中存放数据的类型,可以是: char、short、int、float 等,或自定义类型。
arr_name 指的是数组名的名字。
[ ] 中的常量值是⽤来指定数组的大小的。

初始化

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

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

 //错误的初始化 - 初始化项太多
 int arr3[3] = {1, 2, 3, 4};
//----注意----
//数组如果初始化了,也可以省略各数组的大小指定,编译器会根据数组的初始化内容
//来确定数组的真实大小。

1.2 数组的类型

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

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

1.3 数组下标

C语⾔规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后⼀个元素的下标是n-1

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

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

【C语言】数组_第1张图片

1.4 一维数组在内存中的存储

依次打印数组元素的地址:
#include 
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;
}

输出结果:

【C语言】数组_第2张图片
结论:数组在内存中是连续存放的。

1.5sizeof计算数组元素个数

sizeof 中C语⾔是⼀个关键字,是可以计算类型或者变量大小的, sizeof 也可以计算数组的

大小
如下:
 #include 

 int main()
 {
 int arr[10] = {0};
 printf("%d\n", sizeof(arr));
 return 0;
 }
输出的结果是40,计算的是数组所占内存空间的总⼤⼩,单位是 字节
只要计算出⼀个元素所占字节的个数,数组的元素个数就能算出来
#include 
int main()
{
 int arr[10] = {0};
 printf("%d\n", sizeof(arr[0]));//计算⼀个元素的⼤⼩,单位是字节
 return 0;
}

接下来计算出数组的元素个数:

#include 
int main()
{
 int arr[10] = {0};
 int sz = sizeof(arr)/sizeof(arr[0]);
 printf("%d\n", sz);
 return 0;
}

结果是:10,表⽰数组有10个元素。

二、二维数组

定义⼆维数组,如下:
type arr_name[常量值1][常量值2];
例如:
int arr[3][5];
double data[2][8];
解释:上述代码中出现的信息
3表⽰数组有3⾏
5表⽰每⼀⾏有5个元素
int 表⽰数组的每个元素是整型类型
arr 是数组名,可以根据⾃⼰的需要指定名字data数组意思基本⼀致。

2.1 二维数组的初始化

不完全初始化

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

【C语言】数组_第3张图片

完全初始化

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

【C语言】数组_第4张图片

初始化时省略行,但是不能省略列
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}};

【C语言】数组_第5张图片

2.2   二维数组的下标

C语⾔规定,⼆维数组的⾏是从0开始的,列也是从0开始的,如下所示:
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};

【C语言】数组_第6张图片

2.3 ⼆维数组的输入和输出

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

输⼊和输出的结果:

【C语言】数组_第7张图片

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

【C语言】数组_第8张图片
如图⼆维数组中的每个元素都是连续存放的。
【C语言】数组_第9张图片

三、C99中的变长数组

C99标准之前,C语⾔在创建数组的时候,数组⼤⼩的指定只能使⽤常量、常量表达式,或者如果初始化数据,可省略数组⼤⼩。
C99中给⼀个 变长数组(variable-length array,简称 VLA)的新特性 ,允许我们可以使⽤变量指定 数组大小。
看下面的代码:
int n = a+b;
int arr[n];
数组 arr 就是变长数组,因为它的长度取决于变量 n 的值,编译器没法事先确定,只有运行时才能知道 n 是多少。
变长数组的根本特征 :数组⻓度只有运⾏时才能确定,所以 变长数组不能初始化。
好处:
程序员不必在开发时,随意为数组指定⼀个估计的⻓度,程序可在运⾏时为数组分配精确的长度。
在VS2022上,虽然⽀持⼤部分C99的语法,没有⽀持C99中的变⻓数组
但是可以在gcc编译器上测试。

如下:

#include 
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;
}
第⼀次测试,我给n中输⼊5,然后输⼊5个数字在数组中,并正常输出.
第⼆次测试,我给n中输⼊10,然后输⼊10个数字在数组中,并正常输出.
【C语言】数组_第10张图片

你可能感兴趣的:(c语言,数据结构,开发语言)