文章目录
1.数组的介绍2.一维数组2.1 一维数组的创建与初始化2.2 一维数组的使用2.3 一维数组的存储 3.二维数组3.1 二维数组的创建与初始化3.2 二维数组的使用3.3 二维数组的存储 4.C99中的变长数组希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力!
1.数组的介绍
数组简单理解就是一组相同类型元素的集合
注意:
• 数组中存放的是1个或者多个数据,但是数组元素个数不能为0
• 数组中存放的多个数据,类型是相同的
• 数组分为一维数组和多维数组,常见多维数组为二维数组
2.一维数组
2.1 一维数组的创建与初始化
一维数组其语法形式为:
type arr_name[常量值];int arr[10] = {0};//[]内是元素个数,{}内是初始化的元素
type 可以是 char、float、double等等,也可以是自定义类型的数据
数组去掉其数组名剩下的就是数组的类型,比如:int arr1[10] ,arr1数组的类型是 int [10]
一维数组的完全初始化:
int arr[5] = {1,2,3,4,5};
一维数组的不完全初始化:
int arr2[6] = {1};
第一个元素初始化为1,其余元素初始化为0
一维数组的错误初始化:
int arr3[3] = {1, 2, 3, 4};
超出初始化元素的个数
注意:若 [ ] 内不写个数是可以的,该数组的元素个数根据 { } 的初始化决定
2.2 一维数组的使用
数组是有下标的,假设有一组数组:
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
那它的数组和下标对应关系为
所以C语言为了便于访问数组中的元素,创建了一个操作符 [ ] ,叫下引用操作符
比如我们访问第五个元素,可以使用 arr[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("%d ", arr[i]); } return 0;}
如果我们想要知道数组中元素的个数呢?
那此时我们可以使用C语言中的一个关键字 sizeof 计算类型或变量的大小
那只要计算出一个元素所占字节的个数,数组的元素个数就能算出来
这里我们选择第⼀个元素算大小就可以
#include <stido.h>int main(){ int arr[10] = {0}; int sz = sizeof(arr)/sizeof(arr[0]); printf("%d\n", sz); return 0;}
sizeof(arr) 为数组大小, sizeof(arr[0]) 为数组一个元素的大小,这两相除即为元素个数
2.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("&arr[%d] = %p\n ", i, &arr[i]); } return 0;}
从代码的运行结果来看每个数组地址之间相差4个字节,由此可知一维数组在内存中是连续存放的
3.二维数组
3.1 二维数组的创建与初始化
数组的元素都是内置类型的
如果我们把⼀维数组做为数组的元素,这时候就是二维数组
二维数组作为数组元素的数组被称为三维数组,二维数组以上的数组统称为多维数组
二维数组其语法形式为:
type arr_name[常量值1][常量值2];int arr[3][5];
这里的3表示数组有3行,5表示每行有5个元素
二维数组的完全初始化:
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
12345为第一行,23456为第二行,34567为第三行
int arr4[3][5] = {{1,2},{3,4},{5,6}};
12000为第一行,34000为第二行,56000为第三行
二维数组的不完全初始化:
int arr1[3][5] = {1,2};
第一行初始化为12000,第二、三行都为0
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}};
初始化时省略行,但是不能省略列
3.2 二维数组的使用
C语言规定,二维数组的行是从0开始的,列也是从0开始的,假设有一数组:
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,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}; int i = 0; for(i=0; i<3; i++) //产⽣⾏号 { int j = 0; for(j=0; j<5; j++) //产⽣列号 { printf("%d ", arr[i][j]); //输出数据 } printf("\n"); } return 0;}
3.3 二维数组的存储
像一维数组⼀样,我们如果想研究⼆维数组在内存中的存储方式,我们也是可以打印出数组所有元素的地址的
#include <stdio.h>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;}
从代码运行结果来看,每个元素的地址间也是相隔4个字节,所以二维数组中的每个元素都是连续存放的,像一维数组那样一字排开存储
4.C99中的变长数组
在C99标准之前,C语言在创建数组的时候,数组大小的指定只能使用常量、常量表达式,或者如果我
们初始化数据的话,可以省略数组大小,这样的语法限制,让我们创建数组就不够灵活,有时候数组大了浪费空间,有时候数组小了不够用
于是C99中给了一个变长数组的新特性,允许我们使用变量指定数组大小,例如:
int n = a+b;int arr[n];
数组 arr 就是变长数组,它的长度取决于变量 n 的值,编译器没法事先确定,只有运行时才能知道n是多少
变长数组的根本特征,就是数组长度只有运行时才能确定,所以变长数组不能初始化,它的好处是程
序员不必在开发时,随意为数组指定⼀个估计的长度,程序可以在运行时为数组分配精确的长度
遗憾的是在VS2022上,虽然支持大部分C99的语法,没有支持C99中的变长数组