前言,和小编一起感受数组的魅力!!!
1.数组的概念
数组是一种用于存储相同类型数据元素的数据结构。它是C语言中的一种重要数据类型。数组可以包含多个元素,并通过索引(下标)来访问和操作这些元素。
从概念中发现:
数组中存放的是1个或者多个数据,但是数组元素个数不能为0。
数组中存放的多个数据,类型是相同的。
补充了解:
在C语言中,标准并没有明确禁止定义大小为0的数组,但实际行为取决于具体的编译器和实现。在某些编译器中,定义大小为0的数组可能会导致编译错误或未定义行为。在标准C(C99及之后的标准)中,声明大小为0的数组并不是合法的。
然而,在某些情况下,特别是结构体中的灵活数组成员(flexible array member),可以使用一种类似于0大小数组的结构。
数组分为一维数组和多维数组,常见的多维数组是二维数组。
2.一维数组的创建和初始化
2.1数组创建
在C语言中,数组的声明由元素类型和数组名组成,可以指定数组的大小(元素个数)。以下是数组声明的一般形式:
type arrayName[size];
其中:
type
表示数组中元素的数据类型,可以是基本数据类型(如整数、浮点数、字符等)或自定义类型(如结构体)。arrayName
是数组的名称,用于在程序中引用数组。size
表示数组的大小,即数组中元素的个数。
比如:我们现在想存储某个班级的20人的数学成绩,那我们就可以创建一个数组,如下:
int math[20];
当然我们也可以根据需要创建其他类型和大小的数组:
char ch[8]; double score[10];
2.2数组的初始化
有时候,数组在创建的时候,我们需要给定一些初始值值,这种就称为初始化的。
那数组如何初始化呢?数组的初始化⼀般使用大括号,将数据放在大括号中。
//完全初始化 int arr[5] = {1,2,3,4,5}; //不完全初始化 int arr2[6] = {1};//第⼀个元素初始化为1,剩余的元素默认初始化为0 //错误的初始化 - 初始化项太多,超过了数组大小 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语言中数组的访问提供了⼀个操作符 [ ] ,这个操作符叫:下标引用操作符。
有了下标访问操作符,我们就可以轻松的访问到数组的元素了,比如我们访问下标为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; }
3.2数组元素的输入输出
输入和输出数组的元素,可以使用循环结构来遍历数组。
让数组下标显示出来再进行索引。
#include <stdio.h> int main() { int numbers[5]; // 输入数组元素 printf("Enter 5 numbers:\n"); for (int i = 0; i < 5; i++) { scanf("%d", &numbers[i]); } // 输出数组元素 printf("The numbers are:\n"); for (int i = 0; i < 5; i++) { printf("%d ", numbers[i]); } return 0; }
首先声明了一个包含5个整数的数组
numbers
。然后,使用循环结构来输入数组元素。在每次循环中,通过scanf
函数将输入的值存储到数组的相应位置。接下来,使用循环结构输出数组的元素。在每次循环中,使用printf
函数打印输出数组元素。请注意,在输入和输出数组元素时,循环的控制变量i
表示数组的索引,从0递增到4,对应数组的五个元素。
小结:
一维数组的使用包括数组的声明和初始化、通过索引访问和操作数组元素,以及使用循环结构输入和输出数组元素。这些基本操作可以让您更灵活地处理一组相关的数据。
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个字节)。所以我们得出结论:数组在内存中是连续存放的。
5.sizeof的使用,计算数组个数
sizeof 中C语言是一个关键字,是可以计算类型或者变量大小的,其实 sizeof 也可以计算数组的大小。
#include <stido.h> int main() { int arr[10] = {0}; printf("%d\n", sizeof(arr)); return 0; }
这里输出的结果是40,计算的是数组所占内存空间的总大小,单位是字节。
我们又知道数组中所有元素的类型都是相同的,那只要计算出一个元素所占字节的个数,数组的元素个数就能算出来。这里我们选择第一个元素算大小就可以。
#include <stido.h> int main() { int arr[10] = {0}; int sz = sizeof(arr)/sizeof(arr[0]); printf("%d\n", sz); return 0; }
结果:10
小编提醒:
以后在代码中需要数组元素个数的地方就不用固定写死了,使用上面的计算,不管数组怎么变化,计算出的大小也就随着变化了。
c语言回顾-数组(全网最详细,哈哈哈) (下):https://developer.aliyun.com/article/1624405