import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.CZRoMP2i.js";const l="/c/assets/1.CvTjP5jN.png",p="/c/assets/2.BR4TvWzU.png",h="/c/assets/3.hr3pCY5b.png",k="/c/assets/4.CgvWfxq4.png",t="/c/assets/5.DSekQATc.png",e="/c/assets/6.DjtEKfCa.png",r="/c/assets/7.BTWPdsCm.png",E="/c/assets/8.EoNXwZXz.png",d="/c/assets/9.iU-LaFqX.png",g="/c/assets/10.DYoXU9E6.jpg",y="/c/assets/11.DWDH3yqc.png",F="/c/assets/12.BvBjpbbE.png",c="/c/assets/13.CmPe90qp.png",b="/c/assets/14.MepLJvOt.jpg",u="/c/assets/15.CZUo3kuI.png",C="/c/assets/16.t7xuKRuB.png",o="/c/assets/17.Bkm40EoU.png",m="/c/assets/18.D0Mtsawg.png",B="/c/assets/19.C-mmUOKp.png",A="/c/assets/20.BvSSXPdI.png",D="/c/assets/21.uaya_nVR.png",v="/c/assets/22.CA2ak30R.png",q="/c/assets/9.NlBmD7pA.png",f="/c/assets/24.QdyrLkbx.jpeg",_="/c/assets/25.wg7a3XFP.gif",x="/c/assets/26.M8jrrq2u.gif",P="/c/assets/27.BdWdvezm.png",w="/c/assets/28.C_QI84u9.svg",z="/c/assets/29.BB6sjxx5.svg",T="/c/assets/30.CHyA9Yy8.svg",N="/c/assets/4.DqDR6Thp.svg",O="/c/assets/32.3t5rXZRH.gif",j="/c/assets/33.BRUArxJK.jpg",S="/c/assets/34.DIXK93xX.jpg",I="/c/assets/35.Bvu6CpUv.gif",H="/c/assets/36.DHPPX3_T.gif",W="/c/assets/37.EU7nYUIS.svg",U="/c/assets/38.BMoE_Ep0.svg",Q=JSON.parse('{"title":"第一章:数组的概念","description":"","frontmatter":{},"headers":[],"relativePath":"notes/01_c-basic/05_xdx/index.md","filePath":"notes/01_c-basic/05_xdx/index.md","lastUpdated":1723359736000}'),Z={name:"notes/01_c-basic/05_xdx/index.md"},L=n(`

第一章:数组的概念

1.1 为什么需要数组?

1.1.1 需求分析 1

c
#include <stdio.h>

int main(){
    
    double num1 = 0;
    double num2 = 0;
    double num3 = 0;
    ...
    printf("请输入第 1 个员工的工资:");
    scanf("%lf",&num1);
    printf("请输入第 2 个员工的工资:");
    scanf("%lf",&num2);
    printf("请输入第 3 个员工的工资:");
    scanf("%lf",&num3);
    ...   
    return 0;
}
c
#include <stdio.h>

int main(){
    // 声明数组
    double nums[50];
    // 数组的长度
    int length = sizeof(nums) / sizeof(double);
    // 使用 for 循环向数组中添加值
    for(int i = 0;i < length;i++){
        printf("请输入第 &d 个员工的工资:",i);
        scanf("%lf",&num[i]);
    }
    // 其它操作,如:求最值,求平均值等
    ...        
    return 0;
}

1.1.2 需求分析 2

1.1.3 容器的概念

1.2 什么是数组?

1.3 数组的相关概念

1.4 数组的特点

第二章:数组的操作(⭐)

2.1 数组的定义

2.1.1 动态初始化

c
数据类型 数组名[元素个数|长度];

NOTE

c
#include <stdio.h>

int main() {

    // 先指定元素的个数和类型,再进行初始化

    // 定义数组
    int arr[3];

    // 给数组元素赋值
    arr[0] = 10;
    arr[1] = 20;
    arr[2] = 30;

    return 0;
}

2.1.2 静态初始化 1

c
数据类型 数组名[元素个数|长度] = {元素1,元素2,...}

NOTE

c
#include <stdio.h>

int main() {

    // 定义数组和部分初始化:
    // 会将给定的值从数组的开始位置一个个的赋值,没有赋值的地方,用 0 填充
    int arr[5] = {1, 2};

    return 0;
}
c
#include <stdio.h>

int main() {

    // 定义数组和全部初始化:数组初始化的元素个数等于数组的长度。
    int arr[5] = {1, 2, 3, 4, 5};

    return 0;
}

2.1.3 静态初始化 2

c
数据类型 数组名[] = {元素1,元素2,...}

NOTE

没有给出数组中元素的个数,将由系统根据初始化的元素,自动推断出数组中元素的个数。

c
#include <stdio.h>

int main() {

    // 指定元素的类型,不指定元素个数,同时进行初始化
    int arr[] = {1, 2, 3, 4, 5};

    return 0;
}

2.2 访问数组元素

c
数组名[索引|下标];

NOTE

假设数组 arr 有 n 个元素,如果使用的数组的下标 < 0> n-1 ,那么将会产生数组越界访问,即超出了数组合法空间的访问;那么,数组的索引范围是 [0,arr.length - 1]

c
#include <stdio.h>

int main() {

    // 先指定元素的个数和类型,再进行初始化

    // 定义数组
    int arr[3];

    // 给数组元素赋值
    arr[0] = 10;
    arr[1] = 20;
    arr[2] = 30;

    // 访问数组元素
    printf("arr[0] = %d\\n", arr[0]); // arr[0] = 10
    printf("arr[1] = %d\\n", arr[1]); // arr[1] = 20
    printf("arr[2] = %d\\n", arr[2]); // arr[2] = 30

    return 0;
}
c
#include <stdio.h>

int main() {

    // 定义数组和部分初始化:
    // 会将给定的值从数组的开始位置一个个的赋值,没有赋值的地方,用 0 填充
    int arr[5] = {1, 2};

    // 访问数组元素
    printf("arr[0] = %d\\n", arr[0]); // arr[0] = 1
    printf("arr[1] = %d\\n", arr[1]); // arr[1] = 2
    printf("arr[2] = %d\\n", arr[2]); // arr[2] = 0
    printf("arr[3] = %d\\n", arr[3]); // arr[3] = 0
    printf("arr[4] = %d\\n", arr[4]); // arr[4] = 0

    return 0;
}
c
#include <stdio.h>

int main() {

    // 指定元素的类型,不指定元素个数,同时进行初始化
    int arr[] = {1, 2, 3, 4, 5};

    // 访问数组元素
    printf("arr[0] = %d\\n", arr[0]); // arr[0] = 1
    printf("arr[1] = %d\\n", arr[1]); // arr[1] = 2
    printf("arr[2] = %d\\n", arr[2]); // arr[2] = 3
    printf("arr[3] = %d\\n", arr[3]); // arr[3] = 4
    printf("arr[4] = %d\\n", arr[4]); // arr[4] = 5

    return 0;
}
c
#include <stdio.h>

int main() {

    // 定义数组和全部初始化:数组初始化的元素个数等于数组的长度。
    int arr[5] = {1, 2, 3, 4, 5};

    // 访问数组元素
    printf("arr[0] = %d\\n", arr[0]); // arr[0] = 1
    printf("arr[1] = %d\\n", arr[1]); // arr[1] = 2
    printf("arr[2] = %d\\n", arr[2]); // arr[2] = 3
    printf("arr[3] = %d\\n", arr[3]); // arr[3] = 4
    printf("arr[4] = %d\\n", arr[4]); // arr[4] = 5

    return 0;
}

2.3 数组越界

NOTE

c
#include <stdio.h>

int main() {

    // 定义数组和全部初始化:数组初始化的元素个数等于数组的长度。
    int arr[] = {1, 2, 3, 4, 5};

    // 访问数组元素
    printf("arr[0] = %d\\n", arr[0]); // arr[0] = 1
    printf("arr[1] = %d\\n", arr[1]); // arr[1] = 2
    printf("arr[2] = %d\\n", arr[2]); // arr[2] = 3
    printf("arr[3] = %d\\n", arr[3]); // arr[3] = 4
    printf("arr[4] = %d\\n", arr[4]); // arr[4] = 5
    printf("arr[-1] = %d\\n", arr[-1]); // 得到的是不确定的结果
    printf("arr[5] = %d\\n", arr[5]); // 得到的是不确定的结果

    return 0;
}

2.4 计算数组的长度

NOTE

c
#include <stdio.h>

int main() {

    // 定义数组和全部初始化:数组初始化的元素个数等于数组的长度。
    int arr[] = {1, 2, 3, 4, 5};

    // 计算数组的长度
    size_t length = sizeof(arr) / sizeof(arr[0]);

    // 遍历数组
    for (int i = 0; i < length; i++) {
        printf("%d \\n", arr[i]);
    }

    return 0;
}

2.5 遍历数组

c
#include <stdio.h>

int main() {

    // 定义数组并初始化
    int arr[] = {12, 2, 31, 24, 15, 36, 67, 108, 29, 51};

    // 计算数组的长度
    size_t length = sizeof(arr) / sizeof(int);

    // 遍历数组
    for (int i = 0; i < length; i++) {
        printf("%d\\n", arr[i]);
    }

    return 0;
}
c
#include <stdio.h>

int main() {

    // 定义数组
    int arr[10];

    // 计算数组的长度
    size_t length = sizeof(arr) / sizeof(int);

    // 给数组的每个元素赋值
    for (int i = 0; i < length; i++) {
        arr[i] = i;
    }

    // 遍历数组
    for (int i = 0; i < length; i++) {
        printf("%d\\n", arr[i]);
    }

    return 0;
}

2.6 一维数组的内存分析

2.6.1 数组内存图

c
int arr[] = {1,2,3,4,5};

NOTE

c
#include <stdio.h>

int main() {

    // 定义数组
    int arr[10];

    // 计算数组的长度
    size_t length = sizeof(arr) / sizeof(int);

    // 给数组的每个元素赋值
    for (int i = 0; i < length; i++) {
        arr[i] = i;
    }

    printf("数组的地址是 = %p\\n", arr);

    // 遍历数组
    for (int i = 0; i < length; i++) {
        printf("数组元素 %d 的地址是 = %p\\n", arr[i], &arr[i]);
    }

    return 0;
}

2.6.2 数组的注意事项

WARNING

如果之后试图更改数组名对应的地址,编译器就会报错。

c
int num[5]; // 声明数组
// 使用大括号重新赋值是不允许的,必须在数组声明的时候赋值,否则编译将会报错
num = {1,2,3,4,5} ; // 报错
c
int num[] = {1,2,3,4,5};
// 使用大括号重新赋值是不允许的,必须在数组声明的时候赋值,否则编译将会报错
num = {2,3,4,5,6}; // 报错
c
int num[5];

num = NULL; // 报错,需要和 Java 区别一下,在 C 中不可以
c
int a[] = {1,2,3,4,5} 

int b[5] = a ; // 报错,需要和 Java 区别一下,在 C 中不可以

2.7 数组应用案例

2.7.1 应用示例

c
#include <stdio.h>

int main() {

    // 定义数组并初始化
    int arr[] = {12, 2, 31, 24, 15, 36, 67, 108, 29, 51};

    // 计算数组的长度
    size_t length = sizeof(arr) / sizeof(int);

    // 变量保存总和
    int sum = 0;

    // 遍历数组
    for (int i = 0; i < length; i++) {
        sum += arr[i];
    }

    double avg = (double)sum / length;
    printf("数组的和为:%d\\n", sum); // 数组的和为:375
    printf("数组的平均值为:%.2lf\\n", avg); //数组的平均值为:37.50

    return 0;
}

2.7.2 应用示例

NOTE

思路:

c
#include <stdio.h>

int main() {

    // 定义数组并初始化
    int arr[] = {12, 2, 31, 24, 15, -36, 67, 108, 29, 51};

    // 计算数组的长度
    size_t length = sizeof(arr) / sizeof(int);

    // 定义最大值
    int max = arr[0];
    // 定义最小值
    int min = arr[0];

    // 遍历数组
    for (int i = 0; i < length; i++) {
        if (arr[i] >= max) {
            max = arr[i];
        }
        if (arr[i] <= min) {
            min = arr[i];
        }
    }

    printf("数组的最大值为:%d\\n", max); // 数组的最大值为:108
    printf("数组的最小值为:%d\\n", min); // 数组的最小值为:-36

    return 0;
}

2.7.3 应用示例

c
#include <stdio.h>

int main() {

    // 定义数组并初始化
    int arr[] = {12, 2, 31, 24, 2, -36, 67, 108, 29, 51};

    // 计算数组的长度
    size_t length = sizeof(arr) / sizeof(int);

    // 遍历数组
    printf("当前数组中的元素是:");
    for (int i = 0; i < length; i++) {
        printf("%d ", arr[i]);
    }

    printf("\\n");

    // 无限循环
    while (true) {
        // 统计的数字
        int num;
        // 统计数字出现的次数
        int count = 0;
        // 输入数字
        printf("请输入要统计的数字:");
        scanf("%d", &num);

        // 0 作为结束条件
        if (num == 0) {
            break;
        }

        // 遍历数组,并计数
        for (int i = 0; i < length; i++) {
            if (arr[i] == num) {
                count++;
            }
        }

        printf("您输入的数字 %d 在数组中出现了 %d\\n", num, count);
    }

    return 0;
}

2.7.4 应用示例

c
#include <stdio.h>

#define  SIZE 10

int main() {

    // 定义数组并初始化
    int a[] = {12, 2, 31, 24, 15, -36, 67, 108, 29, 51};
    int b[SIZE];

    // 复制数组
    for (int i = 0; i < SIZE; i++) {
        b[i] = a[i];
    }

    // 打印数组 b 中的全部元素
    for (int i = 0; i < SIZE; i++) {
        printf("%d ", b[i]);
    }

    return 0;
}

2.7.5 应用示例

NOTE

思路:假设数组一共有 10 个元素,那么:

规律就是 a[i] <--互换--> arr[arr.length -1 -i]

c
#include <stdio.h>

int main() {

    // 原始数组
    int arr[] = {12, 2, 31, 24, 15, -36, 67, 108, 29, 51};

    // 计算数组的长度
    size_t SIZE = sizeof(arr) / sizeof(arr[0]);
    
    // 打印原始数组中的全部元素
    printf("原始数组:");
    for (int i = 0; i < SIZE; i++) {
        printf("%d ", arr[i]);
    }
    printf("\\n");

    // 交换数组
    for (int i = 0; i < SIZE / 2; i++) {
        int temp          = arr[i];
        arr[i]            = arr[SIZE - 1 - i];
        arr[SIZE - 1 - i] = temp;
    }

    // 打印交换后的数组
    printf("交换后数组:");
    for (int i = 0; i < SIZE; i++) {
        printf("%d ", arr[i]);
    }
    printf("\\n");

    return 0;
}
c
#include <stdio.h>

int main() {

    // 原始数组
    int arr[] = {12, 2, 31, 24, 15, -36, 67, 108, 29, 51};

    // 计算数组的长度
    size_t SIZE = sizeof(arr) / sizeof(arr[0]);

    // 打印原始数组中的全部元素
    printf("原始数组:");
    for (int i = 0; i < SIZE; i++) {
        printf("%d ", arr[i]);
    }
    printf("\\n");

    // 交换数组
    for (int i = 0, j = SIZE - 1 - i; i < SIZE / 2; i++, j--) {
        int temp = arr[i];
        arr[i]   = arr[j];
        arr[j]   = temp;
    }

    // 打印交换后的数组
    printf("交换后数组:");
    for (int i = 0; i < SIZE; i++) {
        printf("%d ", arr[i]);
    }
    printf("\\n");

    return 0;
}

2.7.6 应用示例

NOTE

思路:从数组的下标 0 开始依次遍历到 length - 1 ,如果 i 下标当前的值比 i+1 下标的值大,则交换;否则,就不交换。

c
#include <stdio.h>

int main() {

    // 原始数组
    int arr[] = {12, 2, 31, -24, 15, -36, 67, 891, 29, 51};

    // 计算数组的长度
    size_t length = sizeof(arr) / sizeof(arr[0]);

    // 打印原始数组中的全部元素
    printf("原始数组:");
    for (int i = 0; i < length; i++) {
        printf("%d ", arr[i]);
    }
    printf("\\n");

    // 移动最大值到数组的最后一个位置
    for (int i = 0; i < length - 1; i++) {
        if (arr[i] > arr[i + 1]) {
            int temp   = arr[i];
            arr[i]     = arr[i + 1];
            arr[i + 1] = temp;
        }
    }

    // 打印移动之后的数组
    printf("移动之后的数组:");
    for (int i = 0; i < length; i++) {
        printf("%d ", arr[i]);
    }
    printf("\\n");

    return 0;
}

2.7.7 应用示例

NOTE

思路:一层循环,能实现最大值移动到数组的最后;那么,二层循环(控制内部循环数组的长度)就能实现将数组的元素从小到大排序。

c
#include <stdio.h>

int main() {

    // 原始数组
    int arr[] = {12, 2, 31, -24, 15, -36, 67, 891, 29, 51};

    // 计算数组的长度
    size_t length = sizeof(arr) / sizeof(arr[0]);

    // 打印原始数组中的全部元素
    printf("原始数组:");
    for (int i = 0; i < length; i++) {
        printf("%d ", arr[i]);
    }
    printf("\\n");

    for (int j = 0; j < length - 1; j++) {
        for (int i = 0; i < length - 1 - j; i++) {
            if (arr[i] > arr[i + 1]) {
                int temp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = temp;
            }
        }
    }

    // 打印移动之后的数组
    printf("移动之后的数组:");
    for (int i = 0; i < length; i++) {
        printf("%d ", arr[i]);
    }
    printf("\\n");

    return 0;
}

第三章:多维数组(⭐)

3.1 概述

3.1.1 引入

3.1.2 多维数组

NOTE

NOTE

3.2 二维数组的定义

3.2.1 动态初始化

c
数据类型 数组名[几个⼀维数组元素][每个⼀维数组中有几个具体的数据元素];

NOTE

c
#include <stdio.h>

int main() {

    // 定义二维数组并初始化
    int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};

    // 输出二维数组中的元素
    printf("%d ", arr[0][0]);
    printf("%d ", arr[0][1]);
    printf("%d ", arr[0][2]);
    printf("%d \\n", arr[0][3]);
    printf("%d ", arr[1][0]);
    printf("%d ", arr[1][1]);
    printf("%d ", arr[1][2]);
    printf("%d \\n", arr[1][3]);
    printf("%d ", arr[2][0]);
    printf("%d ", arr[2][1]);
    printf("%d ", arr[2][2]);
    printf("%d ", arr[2][3]);

    return 0;
}

3.2.2 静态初始化 1

c
数据类型 数组名[行数][列数] = {{元素1,元素2,...},{元素3,...},...}

NOTE

c
#include <stdio.h>

int main() {

    // 定义二维数组并初始化
    int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};

    // 输出二维数组中的元素
    printf("%d ", arr[0][0]);
    printf("%d ", arr[0][1]);
    printf("%d ", arr[0][2]);
    printf("%d \\n", arr[0][3]);
    printf("%d ", arr[1][0]);
    printf("%d ", arr[1][1]);
    printf("%d ", arr[1][2]);
    printf("%d \\n", arr[1][3]);
    printf("%d ", arr[2][0]);
    printf("%d ", arr[2][1]);
    printf("%d ", arr[2][2]);
    printf("%d ", arr[2][3]);

    return 0;
}

3.2.3 静态初始化 2

c
数据类型 数组名[][列数] = {{元素1,元素2,...},{元素3,...},...}

NOTE

c
#include <stdio.h>

int main() {

    // 定义二维数组
    int arr[][4] = {{1, 2, 3, 4}, {5, 6}, {9, 10, 11, 12}};

    // 输出二维数组中的元素
    printf("%d ", arr[0][0]);
    printf("%d ", arr[0][1]);
    printf("%d ", arr[0][2]);
    printf("%d \\n", arr[0][3]);
    printf("%d ", arr[1][0]);
    printf("%d \\n", arr[1][1]);
    printf("%d ", arr[2][0]);
    printf("%d ", arr[2][1]);
    printf("%d ", arr[2][2]);
    printf("%d ", arr[2][3]);

    return 0;
}

3.3 二维数组的理解

c
int arr[3][4];

3.4 二维数组的遍历

NOTE

如果一个二维数组是这么定义的,即:int arr[3][4],那么:

c
#include <stdio.h>

int main() {

    // 定义二维数组
    int arr[][4] = {{1, 2, 3, 4}, {5, 6}, {9, 10, 11, 12}};

    // 获取行列数
    int row = sizeof(arr) / sizeof(arr[0]);
    int col = sizeof(arr[0]) / sizeof(arr[0][0]);

    // 打印二维数组元素
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\\n");
    }

    return 0;
}

3.5 二维数组的内存分析

3.6 二维数组的应用案例

c
#include <stdio.h>

int main() {

    // 定义二维数组,用于保存成绩
    double arr[3][5];

    // 获取二维数组的行数和列数
    int row = sizeof(arr) / sizeof(arr[0]);
    int col = sizeof(arr[0]) / sizeof(arr[0][0]);

    // 从控制台输入成绩
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            printf("请输入第%d个班级的第%d个学生的成绩:", i + 1, j + 1);
            scanf("%lf", &arr[i][j]);
        }
    }

    // 总分
    double totalSum = 0;

    // 遍历数组,求总分和各个班级的平均分
    for (int i = 0; i < row; i++) {
        double sum = 0;
        for (int j = 0; j < col; j++) {
            totalSum += arr[i][j];
            sum += arr[i][j];
        }
        printf("第%d个班级的总分为:%.2lf\\n", i + 1, sum);
        printf("第%d个班级的平均分为:%.2lf\\n", i + 1, sum / col);
    }

    printf("所有班级的总分为:%.2lf\\n", totalSum);
    printf("所有班级的平均分为:%.2lf\\n", totalSum / (row * col));

    return 0;
}

第四章:字符串(⭐)

4.1 概述

NOTE

像这类"Hello World""Hi"等格式 ,使用双引号引起来的一串字符称为字符串字面值,简称字符串。

c
char str[32];
c
"Hello World" // 在 C 语言中,底层存储就是 Hello World\\0

NOTE

在现代化的高级编程语言中,都提供了字符串对应的类型,如:Java 中的 String(JDK 11 之前,底层也是通过 char[] 数组来实现的) 。

4.2 字符数组(字符串)的定义

4.2.1 标准写法

c
#include <stdio.h>

int main() {
    // 禁用 stdout 缓冲区
    setbuf(stdout, NULL);

    // 字符数组,不是字符串
    char c1[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'};
    // C 风格的字符串
    char c2[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '\\0'};

    return 0;
}

4.2.2 简化写法(推荐)

NOTE

简化写法会自动在末尾添加 \\0 字符,强烈推荐使用。

c
#include <stdio.h>

int main() {
    // 禁用 stdout 缓冲区
    setbuf(stdout, NULL);

    char c1[] = {"Hello World"}; // 注意使用双引号,非单引号
    char c2[] = "Hello World";   //  //可以省略一对 {} 来初始化数组元素
    

    return 0;
}

4.3 字符串的输入和输出

NOTE

之前提到,对于 scanf 函数而言,%s 默认是匹配到空格或 Enter 键,如果我们输入的字符串是 Hello World,就只能得到 Hello ;如果要实现匹配到换行,则可以在输入的时候,将格式占位符 %s替换为 %[^\\n]

c
#include <stdio.h>

int main() {
    // 禁用 stdout 缓冲区
    setbuf(stdout, NULL);

    char c1[] = {"Hello World"}; // 注意使用双引号,非单引号
    char c2[] = "Hello World";   //  //可以省略一对 {} 来初始化数组元素

    printf("c1 = %s\\n", c1); // c1 = Hello World
    printf("c2 = %s\\n", c2); // c2 = Hello World

    return 0;
}
c
#include <stdio.h>

int main() {
    // 禁用 stdout 缓冲区
    setbuf(stdout, NULL);

    char str[32];

    printf("请输入字符串:");
    scanf("%[^\\n]", str);

    printf("字符串是:%s\\n", str);

    return 0;
}

第五章:内存中的变量和数组(⭐)

5.1 内存和内存地址

5.1.1 内存

NOTE

NOTE

IMPORTANT

内存就是软件在运行过程中,用来临时存储数据的,最为重要的两个步骤就是:

5.1.2 内存地址

IMPORTANT

答案就是内存地址

NOTE

计算机中存储单位的换算,如下所示:

IMPORTANT

NOTE

NOTE

在 32 位的操作系统中,一共有 4,294,967,296 个内存地址,其最大支持的内存大小是 4,294,967,296 字节,即 4 GB 。

NOTE

IMPORTANT

总结:

5.2 内存中的变量

c
#include <stdio.h>

int main(){
	
    // 定义一个变量并初始化
	int a = 10;
	
	return 0;
}

c
#include <stdio.h>

int main() {

    // 定义一个变量并初始化
    int a = 10;

    printf("变量 a 的首地址是: %p\\n", &a);    // 变量 a 的首地址是: 0000002bf1dffd0c
    printf("变量 a 的中保存的值是: %d\\n", a); // 变量 a 的中保存的值是: 10

    return 0;
}

NOTE

5.3 内存中的数组

c
#include <stdio.h>

int main(){
	
    // 定义一个数组并初始化
	int arr[] = {1,2,3};
	
	return 0;
}

c
#include <stdio.h>

int main() {

    int arr[] = {1, 2, 3};

    printf("arr 的首地址是: %p \\n", arr);      // arr 的首地址是: 0000003a6f7ffcd4
    printf("arr 的首地址是: %p \\n", &arr);     // &arr 的地址是: 0000003a6f7ffcd4
    printf("arr[0] 的地址是: %p \\n", &arr[0]); // arr[0] 的地址是: 0000003a6f7ffcd4
    printf("arr[1] 的地址是: %p \\n", &arr[1]); // arr[1] 的地址是: 0000003a6f7ffcd8
    printf("arr[2] 的地址是: %p \\n", &arr[2]); // arr[2] 的地址是: 0000003a6f7ffcdc

    return 0;
}

WARNING

在上述示例中,arr&arr 的值是一样的,但是对应的含义是不同的。

`,251),R=[L];function J(M,G,X,K,V,Y){return a(),i("div",null,R)}const ss=s(Z,[["render",J]]);export{Q as __pageData,ss as default};