数组名称不可以代表任何存储区(数组名称不可以被赋值),数组名称可以代表数组里第一个存储区的地址

/*
 * 数组练习
 * */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    int arr[7] = {0}, arr1[7] = {0}, tmp = 0, cnt = 0, num = 0, num1 = 0;
    srand(time(0));
    do {
        tmp = rand() % 36 + 1;
        //检查新数字是否可以使用
        for (num = 0;num <= cnt - 1;num++) {
            if (tmp == arr[num]) {
                break;
            }
        }
        //如果for循环正常结束就说明新数字可以
        //使用,否则不能使用
        if (num >= cnt) {
            arr[cnt] = tmp;
            cnt++;
        }
    } while (cnt < 7);
    for (num = 0;num <= 6;num++) {
        printf("%d ", arr[num]);
    }
    printf("\n");
    for (num = 0;num <= 6;num++) {
        printf("请输入一个数字:");
        scanf("%d", &arr1[num]);
    }
    cnt = 0;
    for (num = 0;num <= 6;num++) {
        for (num1 = 0;num1 <= 6;num1++) {
            if (arr[num] == arr1[num1]) {
                cnt++;
                break;
            }
        }
    }
    printf("买对的数字个数是%d\n", cnt);
    return 0;
}

可以对数组名称进行sizeof计算,结果是数组里所有存储区的总大小

/*
 * 变长数组演示
 * */
#include <stdio.h>
int main() {
    int size = 0;
    printf("请输入一个整数:");
    scanf("%d", &size);
    int arr[size];          //变长数组
    printf("sizeof(arr)是%d\n", sizeof(arr));
    return 0;
}

C99规范里允许使用变长数组,声明变长数组的时候用变量表示数组里的存储区个数,如果程序多次运行则每次运行的时候变长数组里包含的存储区个数都可能不同,某一次程序执行过程中变长数组里包含的存储区个数不会改变,变长数组不可以初始化

多维数组可以用来表示存储区的分组情况,不能表示存储区分组情况的数组叫一维数组,二维数组可以表示存储区的一次分组情况,这是最常见的多维数组.声明二维数组的时候需要提供两个整数,第一个整数表示分组个数,第二个整数表示每组里的存储区个数.二维数组名称后加两个下标可以表示二维数组里的一个存储区,前一个下标是分组编号(组下标),后一个下标是存储区编号(组内下标),组下标的有效范围从0开始到分组个数减一为止,组内下标的有效范围从0开始到组内存储区个数减一为止,可以采用多重循环依次处理二维数组里的每个存储区

/*
 * 二维数组演示
 * */
#include <stdio.h>
int main() {
    int arr[][2] = {{1, 2}, {3}, {6}};     //二维数组演示
    //arr[1][0] = 10;
    int row = 0, col = 0, num = 1;
    /*for (row = 0;row <= 2;row++) {
        for (col = 0;col <= 1;col++) {
            arr[row][col] = num;
            num++;
        }
    }*/
    for (row = 0;row <= 2;row++) {
        for (col = 0;col <= 1;col++) {
            printf("%d ", arr[row][col]);
        }
        printf("\n");
    }
    return 0;
}

可以把二维数组当作一维数组进行初始化,也可以在初始化的时候对初始化数据进行分组,每组初始化数据用来初始化一组存储区,如果可以根据初始化数据计算出分组个数就可以省略二维数组声明里的分组个数

二维数组名称也用来代表二维数组里第一个存储区的地址对二维数组名称进行sizeof计算结果是二维数组里所有存储区的总大小

可以在二维数组名称后只使用一个下标,这个下标是组下标。这个写法代表那一组里第一个存储区的地址。二维数组名称后加一个下标也可以看作是一个一维数组,这个一维数组里包含下标对应组中所有的存储区。

/*
 * 扫雷游戏练习
 * */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    int map[10][10] = {0}, row = 0, col = 0, cnt = 0, num = 0;
    int delta[][2] = {-1, -1, -1, 0, -1, 1,
        0, -1, 0, 1, 1, -1, 1, 0, 1, 1};
    int tmp_row = 0, tmp_col = 0;
    srand(time(0));
    do {
        //找到一个随机位置
        row = rand() % 10;
        col = rand() % 10;
        if (!map[row][col]) {
            //如果这个位置里不是地雷就放一个地雷
            map[row][col] = -1;
            cnt++;   //地雷个数加一
        }
    } while (cnt < 10);
    for (row = 0;row <= 9;row++) {
        for (col = 0;col <= 9;col++) {
            if (map[row][col] == -1) {
                continue;
            }
            for (num = 0;num <= 7;num++) {
                tmp_row = row + delta[num][0];
                tmp_col = col + delta[num][1];
                if (tmp_row < 0 || tmp_row > 9) {
                    continue;
                }
                if (tmp_col < 0 || tmp_col > 9) {
                    continue;
                }
                if (map[tmp_row][tmp_col] == -1) {
                    map[row][col]++;
                }
            }
        }
    }
    for (row = 0;row <= 9;row++) {
        for (col = 0;col <= 9;col++) {
            if (!map[row][col]) {
                printf("O");
            }
            else if (map[row][col] == -1) {
                printf("X");
            }
            else {
                printf("%d", map[row][col]);
            }
        }
        printf("\n");
    }
    return 0;
}

C语言里可以采用分组方式管理语句,每个语句分组叫做一个函数

多函数程序执行时的时间分配情况必须遵守以下规则
  1.整个程序的执行时间被分成几段,每段被分配给一个函数使用
  2.所有时间段之间不能互相重叠并且必须连续
  3.如果函数A把自己的时间分配给函数B使用则函数B结束后必须把后面的时间还给函数A

如果函数A把自己的时间分配给了函数B则它们之间存在函数调用关系,在这个函数调用关系中函数A叫做调用函数,函数B叫做被调用函数,只有在被调用函数工作期间才存在函数调用关系

函数调用语句可以在函数之间产生函数调用关系

/*
 * 函数演示
 * */
#include <stdio.h>
void func(void) {
    int num;
    printf("num是%d\n", num);
    num = 10;
}
void func1(void) {
    int num = 1000;
    func();
}
int main() {
    func();
    func1();
    return 0;
}

不可以跨函数使用变量,不同函数里的变量可以重名,如果函数多次执行则每次执行的时候里面的变量对应的存储区都可能不同,可以使用volatile关键字声明变量,这种变量的内容可以被其他程序修改