【C语言】数组

一、数组的定义

1.1 什么是数组?

数组是一种数据结构,它可以存储多个相同类型的元素。

1.2 数组的定义

一般形式:数据类型 数组名[数组长度]

•int grades[100];//定义了一个名为gardes的整数数组,该数组可以存储100个整数。

•元素数量必须是整数
C99之前:元素数量必须是编译时刻确定的字面量,也就是不能使用变量或表达式来指定数组的大小。这意味着在声明数组时,必须使用一个明确的常量来表示数组的大小。

例如,下面的代码是不被允许的:

cpp 复制代码
int size = 10;
int arr[size]; // 编译错误,不能使用变量来指定数组大小

C99之后:C99引入了可变数组(VLA),允许使用变量来指定数组的大小。这在某些情况下非常方便,特别是当你需要在运行时根据条件来确定数组的大小时。

1.3 数组的初始化

C语言中,对数组进行初始化有多种方式。下面会一一列举:

1.逐个初始化。

cpp 复制代码
int arr[5];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
arr[4] = 5;//arr[5]={1,2,3,4,5}

2.使用初始化列表。

cpp 复制代码
int arr[5]={1,2,3,4,5};//arr[5]={1,2,3,4,5}

3.使用部分初始化列表,剩下的元素会自动初始化为0。

cpp 复制代码
int arr[5]={1,2,3};//arr[5]={1,2,3,0,0}

4.使用循环初始化

cpp 复制代码
int arr[5];
for (int i = 0; i < 5; i++) {
    arr[i] = i + 1;
}

二、数组的应用

2.1 数组分类

一维数组:数组是由相同类型的元素组成的有序集合,可以包含任意数量的元素。一维数组是最简单的数组形式,所有元素都排列在同一个线性序列中。

cpp 复制代码
int numbers[5];

多维数组:除了一维数组,C语言还支持多维数组。多维数组是由多个一维数组组成的数据结构,可以是二维、三维或更高维度的数组。

cpp 复制代码
int a[3][2][6];//三维数组

静态数组:静态数组在声明时就给定了固定的大小,无法在运行时改变数组的大小。

cpp 复制代码
int numbers[5];

动态数组:动态数组是在运行时使用malloc或calloc等函数动态分配内存空间的数组,可以根据需要改变数组的大小。

cpp 复制代码
    printf("请输入数组大小:");
    scanf("%d", &size);

    arr = (int*)malloc(size * sizeof(int));// 使用malloc函数动态分配内存

    for (int i = 0; i < size; i++) {
        scanf("%d", &arr[i]);
    }

2.2 访问数组

数组元素的访问:数组中的元素可以通过索引来访问,索引从0开始,依次递增。例如,数组arr的第一个元素可以通过arr[0]访问,第二个元素可以通过arr[1]访问,以此类推。

cpp 复制代码
	int a[5] = { 1,2,3,4,5 };
	printf("%d", a[0]);//输出1
	printf("%d", a[1]);//输出2
	printf("%d", a[2]);//输出3
	printf("%d", a[3]);//输出4
	printf("%d", a[4]);//输出5

数组名的特殊性:在C语言中,++数组名本身实际上是一个指向数组第一个元素的指针++,可以通过数组名来访问数组的元素。arr==&arr[0]。

cpp 复制代码
	int a[5] = { 1,2,3,4,5 };
	scanf_s("%d", a);
	printf("%d", a[0]);//输入XX,就输出XX

数组不要越界访问:C语言中的数组是没有边界检查的,如果访问超出数组范围的元素,可能会访问到非法内存区域,导致程序崩溃或产生不可预期的结果。

cpp 复制代码
int arr[5] = {1, 2, 3, 4, 5};
int x = arr[6]; // 越界访问

2.3 数组作为函数参数(int a[]==int *a)

数组作为函数参数:在函数中,可以将数组作为参数传递给函数。

++函数参数int a[]和int *a传递的东西是一样的。++在函数调用时,数组名a会被自动转换为指向数组第一个元素的指针。因此,无论是使用int a[]还是int *a作为函数参数,在函数内部都可以通过指针操作来访问或修改数组的元素。

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

void f(int *a, int L);//指针作为函数参数

int main() {
	int a[5] = {1,2,3,4,5};
	f(a, sizeof(a) / sizeof(int));
	printf("%d", a[0]);//输出99,成功修改a[0]
	return 0;
}

void f(int *a, int L) {
	a[0] = 99;
}
cpp 复制代码
#include<stdio.h>

void f(int a[], int L);//数组作为函数参数

int main() {
	int a[5] = {1,2,3,4,5};
	f(a, sizeof(a) / sizeof(int));
	printf("%d", a[0]);//输出99,成功修改a[0]
	return 0;
}

void f(int a[], int L) {
	a[0] = 99;
}

2.4 数组长度(sizeof)

数组的长度:数组的长度可以通过sizeof运算符来获取。

例如:sizeof(arr)返回数组arr的总字节数。

cpp 复制代码
	int arr[5] = { 1,2,3,4,5 };
	printf("%zu", sizeof(arr));//输出20

sizeof(arr[0])返回数组元素的字节数。

cpp 复制代码
	int arr[5] = { 1,2,3,4,5 };
	printf("%zu", sizeof(arr[0]));//输出4

sizeof(arr)/sizeof(arr[0])返回数组元素个数。

cpp 复制代码
	int arr[5] = { 1,2,3,4,5 };
	printf("%zu", sizeof(arr)/sizeof(arr[0]));//输出5

三、字符串与数组的关系

在C语言中,字符串可以被视为字符数组。另有文章讲解:

四、可变数组

(未完待续)

相关推荐
大胆飞猪1 小时前
递归、剪枝、回溯算法---全排列、子集问题(力扣.46,78)
算法·leetcode·剪枝
molunnnn3 小时前
第四章 Agent的几种经典范式
开发语言·python
Aldrich_323 小时前
蓝桥杯嵌入式赛道—-软件篇(GPIO输出模式配置)
c语言·vscode·stm32·单片机·嵌入式硬件·蓝桥杯
Kisorge3 小时前
【电机控制】基于STM32F103C8T6的二轮平衡车设计——LQR线性二次线控制器(算法篇)
stm32·嵌入式硬件·算法
洛_尘3 小时前
JAVA EE初阶 2: 多线程-初阶
java·开发语言
@卞4 小时前
C语言常见概念
c语言·开发语言
铭哥的编程日记4 小时前
深入浅出蓝桥杯:算法基础概念与实战应用(二)基础算法(下)
算法·职场和发展·蓝桥杯
Swift社区4 小时前
LeetCode 421 - 数组中两个数的最大异或值
算法·leetcode·职场和发展
cici158744 小时前
基于高光谱成像和偏最小二乘法(PLS)的苹果糖度检测MATLAB实现
算法·matlab·最小二乘法