C 数组

程序中定义数组是为了实现将离散变量变为连续变量(变量内存单元连续),利用循环使程序处理简单化。

一、一维数组

定义与赋值

char arr[10];
// 循环赋值
for (int i = 0; i < 10; ++i) {
    arr[i] = 'A' + i;
}
for (int i = 0; i < 10; ++i) {
    printf("%c	", arr[i]);
}

// 直接赋值,未赋值元素默认为 0
short int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
for (int i = 0; i < 10; ++i) {
    printf("%d", a[i]);
}

// 数组长度为 3
short int b[] = {1, 2, 3};

// 数组不初始化,元素为随机值
short int c[];

通过地址取值

char arr[10];
for (int i = 0; i < 10; ++i) {
    arr[i] = 'A' + i;
}

// 直接打印变量名为数组第一个元素的指针,取指定元素的地址 &arr[5]
printf("
%p", a);

for (int i = 0; i < 10; ++i) {
    printf("%c	", *(arr + sizeof(char) * i));
}

初始化和拷贝

#include <stdio.h>
#include <string.h>

int main() {
    char arr[10];

    // 初始化,全部赋值为 A
    memset(arr, 'C', 10 * sizeof(char));

    for (int i = 0; i < 10; ++i) {
        printf("%c	", arr[i]);
    }

    printf("
");

    char cpy[10];
    // 拷贝前 5 个,后 5 个未赋值的为空(已初始化)
    memcpy(cpy, arr, 5 * sizeof(char));
    for (int i = 0; i < 10; ++i) {
        printf("%c	", cpy[i]);
    }

    return 0;
}

二、多维数组

定义与赋值

// 数组的维数上限仅受编译程序限制
// 二维数组的元素是一个一维数组
// 二维数组物理上按行存储
// a[0] -> a[0][0],a[0][1],a[0][2]
// a[1] -> a[1][0],a[1][1],a[1][2]

// 未赋值默认为 0
// 不允许 int arr[2][3] = {{},{5, 6}}; 至少要有一个元素
int arr[2][3] = {{1},{5, 6}};

// 等同定义 arr[2][3]
int arr[][3] = {{1, 2, 3},{4, 5, 6}};

// 等同于 int arr[2][3] = {1, 2, 3, 4, 5, 6};
// 等同于 int arr[][3] = {1, 2, 3, 4, 5, 6};
int arr[2][3] = {{1, 2, 3},{4, 5, 6}};

for (int i = 0; i < 2; ++i) {
    for (int j = 0; j < 3; ++j) {
        printf("%d	", arr[i][j]);
    }
    printf("
");
}

// 二维数组变量名是数组所占内存空间的首地址
// 也就是第一个元素的指针
printf("%p", arr);

三、字符串与数组

字符串是一种以 结尾的数组

   ASCII:  0x63  0x68  0x69  0x6e  0x61    0
对应字符串:   c     h     i     n     a      

定义与赋值

// 会自动添加  ,数组大小为 6
char str[] = "china";
// 手动添加  ,数组大小为 6
char str[] = {'c', 'h', 'i', 'n', 'a','