C_数组

C_数组

C语言中的变量可以根据存储的数据类型和结构来分为标量变量聚合变量

标量变量(Scalar Variables):标量变量是指单一的数据项,表示单个值。常见的标量类型包括整数、浮点数、字符和枚举等。

聚合变量(Aggregate Variables):聚合变量是指由多个数据项组成的集合,每个数据项可以是标量类型,也可以是其它聚合类型。常见的聚合类型包括数组、结构体和联合体等。聚合变量可以同时保存多个值。

按维度分类

一维数组

一维数组是一组按照线性排列的元素集合,每个元素都有一个唯一的下标,可以用数组索引来访问数组中的元素。

1
type arrayName[arraySize];

数组初始化

  1. 用大括号包含一组常量表达式,常量表达式之间用逗号分隔。

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

    当初始化式比数组短,剩余元素被初始化为 0,但初始化式不能比数组长,也不能完全为空。

  2. 给定了初始化式,可以省略数组的长度:

    1
    int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  3. 数组元素可以是任何类型,数组的长度则必须是常量表达式 (能够在编译期间求值的表达式)。一般使用宏来

    定义数组的长度:

    1
    2
    3
    #define N 10
    ...
    int a[N];

多维数组

多维数组是一种具有多个维度的数组,元素在多个维度上排列。常见的多维数组有二维数组、三维数组等。

1
type arrayName[size1][size2]...[sizeN];

多维数组初始化:

  1. 嵌套一维数组初始化式,可以构建二维数组的初始化式,更高维数组可以采取类似的方法构建。

    1
    2
    3
    4
    5
    int matrix[5][9] = {{1, 1, 1, 1, 1, 0, 1, 1, 1},
                      {0, 1, 0, 1, 0, 1, 0, 1, 0},
                      {0, 1, 0, 1, 1, 0, 0, 1, 0},
                      {1, 1, 0, 1, 0, 0, 0, 1, 0},
                      {1, 1, 0, 1, 0, 0, 1, 1, 1}};
  2. 初始化式的长度不够,剩余元素被初始化为 0

  3. 内层初始化式不足以填满数组的一行,这一行剩余的元素会被初始化为0

  4. 可以省略内存的大括号,编译器一旦发现值足以填满一行,就开始填充下一行。(在初始化式中省略内层大括号是非常危险的,不小心多写或者少写一个值都会影响后面元素的初始化)

按存储方式分类

静态数组

静态数组是在编译时分配内存空间的数组,其大小在编译时确定,通常使用数组声明语句来定义。静态数组的声明和初始化可以在程序的任何位置进行。

1
int static Array[5] = {1, 2, 3, 4, 5}; // 静态数组的声明和初始化

动态数组

动态数组是在程序运行时动态分配内存空间的数组,其大小可以根据需要在运行时确定,通常使用动态内存分配函数来创建,如malloccalloc等。

1
2
3
int *dynamicArray;
int size = 5;
dynamicArray = (int*)malloc(size * sizeof(int)); // 动态分配数组内存

按声明方式分类

全局数组

全局数组是在函数外部声明的数组,其作用域为整个文件,可以被文件中的所有函数访问。

1
2
3
4
5
6
7
8
#include <stdio.h>
int globalArray[5]; // 全局数组声明
int main() {
// 在main函数中访问全局数组
globalArray[0] = 10;
printf("Value of globalArray[0]: %d\n", globalArray[0]);
return 0;
}

局部数组

局部数组是在函数内部声明的数组,其作用域仅限于声明它的函数内部,无法被其它函数访问。

1
2
3
4
5
6
7
#include <stdio.h>
void function() {
int localArray[3]; // 局部数组声明
// 在函数中访问局部数组
localArray[0] = 5;
printf("Value of localArray[0]: %d\n", localArray[0]);
}

其它分类方式

字符数组

字符数组是一种特殊的一维数组,其元素类型为字符型,通常用于存储字符串。

1
char str[6] = "Hello"; // 声明并初始化字符数组

数组指针

数组指针是指向数组的指针,可以用于动态多维数组的实现。

1
int (*ptr)[5]; // 声明一个指向包含5个整数的数组的指针

数组参数

数组参数可以在函数参数中使用数组类型,可以通过数组名传递数组,也可以传递指向数组首元素的指针。

1
2
3
4
5
6
void printArray(int arr[], int size) {
for (int i = 0; i < size; ++i) {
printf("%d ", arr[i]);
}
printf("\n");
}

常量数组

声明时加上 const 修饰符而变成 “常量”:

1
2
3
const char hex_chars[] =
{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F'};

程序在运行期间不会对数组进行修改。 const 不仅仅可以修饰数组,还可以修饰任意变量。

对数组使用sizeof运算符

sizeof 运算符可以确定数组元素的大小,两者相除即得到数组的长度:

1
sizeof(a) / sizeof(a[0])

清空数组可以写成如下形式:

1
2
for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
a[i] = 0;

为了可读性和通用性,把 sizeof(a) / sizeof(a[0]) 定义为带参数的宏

1
#define SIZE(a) (sizeof(a) / sizeof(a[0]))